LOGIN   :::   RECOVER PASS   :::   GET ACCOUNT    
Browse
  • Projects
  • Code (CVS)
  • Forums
  • News
  • Articles
  • Polls
  •  
    OpenCores
  • FAQ
  • CVS HowTo
  • Mission
  • Media
  • Tools
  • Advertise
  • Mirrors
  • Logos
  • Contact us
  • Job Opportunity
  •  
    Tools
  • Search
      
  • Download Cores (CVSGet)
  •  
    More
  • Wishbone
  • Perlilog
  • EDA tools
  • OpenTech CD
  •  
    Navigation: All forums > Cvs-checkins > Message List > Message Post

    Message

    Reply | Reply all
    Date Prev | Date Next | Thread Prev | Thread Next Date Index | Thread Index

    From: cvs at opencores.org<cvs@o...>
    Date: Mon Jun 30 18:01:57 CEST 2008
    Subject: [cvs-checkins] MODIFIED: cryptosorter ...
    Top
    Date: 00/08/06 30:18:01

    Added: cryptosorter/memocodeDesignContest2008/aesCore/bsv
    aesCipherTop.bsv aes_core.c aes_core.h
    mkAESCores2.sched mkAESCores3.sched
    reference_cipher.c
    Log:
    Initial checkin with actual source




    Revision Changes Path
    1.1 cryptosorter/memocodeDesignContest2008/aesCore/bsv/aesCipherTop.bsv

    http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/aesCore/bsv/aesCipherTop.bsv?rev=1.1&content-type=text/x-cvsweb-markup

    Index: aesCipherTop.bsv
    ===================================================================
    /*
    Copyright (c) 2008 MIT

    Permission is hereby granted, free of charge, to any person
    obtaining a copy of this software and associated documentation
    files (the "Software"), to deal in the Software without
    restriction, including without limitation the rights to use,
    copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the
    Software is furnished to do so, subject to the following
    conditions:

    The above copyright notice and this permission notice shall be
    included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    OTHER DEALINGS IN THE SOFTWARE.

    Author: Kermin Fleming
    */

    /* This file contains a variety of implemenations of aesCore hardware. Each
    module instantiates a parametric number of aesCores. Basic operation
    is as follows: start will cause the core to begin streaming out a sequence
    of aes values. Next will cause the next value in the sequence to appear
    in some arbitrary amount of time (probably less than 12 cycles).
    Some of the designs also support a seperate
    clock domain for the aes cores and local control. The domain crossing is
    implemented via Bluespec domain crossing library code. */

    import FIFO ::*;
    import Vector ::*;
    import StmtFSM ::*;
    import Memocode08Types ::*;
    import RegFile ::*;
    import FIFOF ::*;
    import Clocks ::*;


    typedef Bit#(128) AES_block;
    typedef Bit#(128) AES_key;
    typedef Bit#(8) Byte;
    typedef Bit#(32) Word;

    `define AESDebug False

    // This is the top level module used by the sorting control
    interface AESCores#(numeric type t);
    method Action start(Bit#(5) end_seq);
    method ActionValue#(AES_block) get_next();
    endinterface

    interface AESCoresShuffle#(numeric type t);
    method Action start(Bit#(5) end_seq,Bit#(4) seed, Bit#(4) stride);
    method ActionValue#(AES_block) get_next();
    endinterface

    import "BVI" aes_pipelined_cipher_top =
    module mkAESPipeline (AES);

    default_clock clk(clk);
    default_reset rst(rst);

    method text_out get_result() ready(done);
    method decrypt(text_in, key) ready(ready) enable(ld);

    schedule decrypt CF (get_result);
    schedule get_result CF (decrypt);

    schedule decrypt C decrypt;
    schedule get_result C get_result;

    endmodule


    module mkAESCorePipelined(AESCores#(1));

    Reg#(int) ptr <- mkReg(0); Reg#(Bit#(2)) iter <- mkReg(0); Reg#(int) limit <- mkReg(0); Reg#(int) scount <- mkReg(0); Reg#(int) rcount <- mkReg(0); AES_key key = {8'hB0, 8'h1D, 8'hFA, 8'hCE, 8'h0D, 8'hEC, 8'h0D, 8'hED, 8'h0B, 8'hA1, 8'h1A, 8'hDE, 8'h0E, 8'hFF, 8'hEC, 8'h70}; AES core <- mkAESPipeline(); Reg#(Bit#(4)) inflight <- mkReg(0); FIFO#(Bit#(5)) commandQ <- mkFIFO; FIFO#(Bit#(128)) respQ <- mkSizedFIFO(16); FIFO#(Bit#(0)) respTokenQ <- mkSizedFIFO(16); rule startRule(iter == 0); if(`AESDebug) $display("Calling start"); commandQ.deq; iter <= 2; limit <= 1<<commandQ.first(); rcount <= 1; core.decrypt(0, key); respTokenQ.enq(?); endrule rule sendMore(iter>0 && (inflight != 15)); if(rcount+1 == limit) // We pre-issue some requests. begin iter <= iter-1; rcount <= 0; end else begin rcount <= rcount + 1; end respTokenQ.enq(?); core.decrypt(pack(zeroExtend(rcount)), key); if(`AESDebug) $display("Count[1] is %d, reading core %d",rcount, ptr); endrule rule resp; respQ.enq(core.get_result()); endrule method Action start(Bit#(5) end_seq); commandQ.enq(end_seq); endmethod method ActionValue#(AES_block) get_next(); // Must deal with trailing pointer. We issue too many reqs... respQ.deq(); respTokenQ.deq(); return respQ.first; endmethod endmodule module mkAESCorePipelinedShuffle(AESCoresShuffle#(1)); Reg#(int) ptr <- mkReg(0); Reg#(Bit#(4)) stride <- mkReg(0); Reg#(Bit#(4)) init <- mkReg(0); Reg#(Bit#(2)) iter <- mkReg(0); Reg#(Bit#(19)) limit <- mkReg(0); Reg#(Bit#(19)) scount <- mkReg(0); Reg#(Bit#(19)) rcount <- mkReg(0); AES_key key = {8'hB0, 8'h1D, 8'hFA, 8'hCE, 8'h0D, 8'hEC, 8'h0D, 8'hED, 8'h0B, 8'hA1, 8'h1A, 8'hDE, 8'h0E, 8'hFF, 8'hEC, 8'h70}; AES core <- mkAESPipeline(); Reg#(Bit#(4)) inflight <- mkReg(0); FIFO#(Tuple3#(Bit#(5),Bit#(4),Bit#(4))) commandQ <- mkFIFO; FIFO#(Bit#(128)) respQ <- mkSizedFIFO(16); FIFO#(Bit#(0)) respTokenQ <- mkSizedFIFO(16); rule startRule(iter == 0); if(`AESDebug) $display("Calling start"); commandQ.deq; match {.total,.initNew,.strideNew} = commandQ.first(); iter <= 2; limit <= 1<<total; rcount <= zeroExtend(initNew)+zeroExtend(strideNew); init <= initNew; stride <= strideNew; core.decrypt(zeroExtend(initNew), key); respTokenQ.enq(?); endrule rule sendMore(iter>0 && (inflight != 15)); if(rcount+zeroExtend(stride) > limit) // We pre-issue some requests. begin iter <= iter-1; rcount <= zeroExtend(init); end else begin rcount <= rcount + zeroExtend(stride); end respTokenQ.enq(?); core.decrypt(pack(zeroExtend(rcount)), key); if(`AESDebug) $display("Count[1] is %d, reading core %d",rcount, ptr); endrule rule resp; respQ.enq(core.get_result()); endrule method Action start(Bit#(5) end_seq,Bit#(4) seed, Bit#(4) stride); commandQ.enq(tuple3(end_seq,seed,stride)); endmethod method ActionValue#(AES_block) get_next(); // Must deal with trailing pointer. We issue too many reqs... respQ.deq(); respTokenQ.deq(); return respQ.first; endmethod endmodule module mkAESCorePipelinedMCD#(Clock slowClock, Reset slowReset) (AESCores#(1)); Reg#(int) ptr <- mkReg(0); Reg#(Bit#(2)) iter <- mkReg(0); Reg#(int) limit <- mkReg(0); Reg#(int) scount <- mkReg(0); Reg#(int) rcount <- mkReg(0); AES_key key = {8'hB0, 8'h1D, 8'hFA, 8'hCE, 8'h0D, 8'hEC, 8'h0D, 8'hED, 8'h0B, 8'hA1, 8'h1A, 8'hDE, 8'h0E, 8'hFF, 8'hEC, 8'h70}; AES core <- mkAESPipeline(); Reg#(Bit#(4)) inflight <- mkReg(0); SyncFIFOIfc#(Bit#(5)) commandQ <- mkSyncFIFOToCC(2,slowClock,slowReset); SyncFIFOIfc#(Bit#(128)) respQ <- mkSyncFIFOFromCC(16,slowClock); SyncFIFOIfc#(Bit#(1)) respTokenQ <- mkSyncFIFOFromCC(16,slowClock); rule startRule(iter == 0); if(`AESDebug) $display("Calling start"); commandQ.deq; iter <= 2; limit <= 1<<commandQ.first(); rcount <= 1; core.decrypt(0, key); respTokenQ.enq(?); endrule rule sendMore(iter>0 && (inflight != 15)); if(rcount+1 == limit) // We pre-issue some requests. begin iter <= iter-1; rcount <= 0; end else begin rcount <= rcount + 1; end respTokenQ.enq(?); core.decrypt(pack(zeroExtend(rcount)), key); if(`AESDebug) $display("Count[1] is %d, reading core %d",rcount, ptr); endrule rule resp; respQ.enq(core.get_result()); endrule method Action start(Bit#(5) end_seq); commandQ.enq(end_seq); endmethod method ActionValue#(AES_block) get_next(); // Must deal with trailing pointer. We issue too many reqs... respQ.deq(); respTokenQ.deq(); return respQ.first; endmethod endmodule module mkAESCores(AESCores#(num_cores)); Reg#(int) ptr <- mkReg(0); Reg#(Bit#(2)) iter <- mkReg(0); Reg#(Bit#(19)) limit <- mkReg(0); Reg#(Bit#(19)) count <- mkReg(0); Reg#(Bit#(19)) rcount <- mkReg(0); AES_key key = {8'hB0, 8'h1D, 8'hFA, 8'hCE, 8'h0D, 8'hEC, 8'h0D, 8'hED, 8'h0B, 8'hA1, 8'h1A, 8'hDE, 8'h0E, 8'hFF, 8'hEC, 8'h70}; Vector#(num_cores, AES) cores <- replicateM(mkAES); let nc_i = fromInteger(valueOf(num_cores)); FIFO#(Bit#(5)) commandQ <- mkFIFO; FIFO#(Bit#(128)) respQ <- mkFIFO; rule startRule(iter == 0); if(`AESDebug) $display("Calling start"); commandQ.deq; iter <= 2; limit <= 1<<commandQ.first(); count <= 0; rcount <= nc_i; ptr <= 0; for(int i = 0; i < nc_i; i=i+1) cores[i].decrypt(pack(zeroExtend(i)), key); endrule rule respRule(iter > 0); if(rcount+1 == limit) // We pre-issue some requests. begin rcount <= 0; end else begin rcount <= rcount + 1; end if(count + 1 == limit) begin iter <= iter-1; count <= 0; end else begin count <= count + 1; end ptr <= (ptr+1 == nc_i)?0:(ptr+1); // ptr tells us which aes core to grab data from cores[ptr].decrypt(pack(zeroExtend(rcount)), key); if(`AESDebug) $display("Count[%d] is %d, reading core %d",nc_i,rcount, ptr); respQ.enq(cores[ptr].get_result()); endrule method Action start(Bit#(5) end_seq); commandQ.enq(end_seq); endmethod method ActionValue#(AES_block) get_next(); // Must deal with trailing pointer. We issue too many reqs... respQ.deq(); return respQ.first; endmethod endmodule interface AES; method Action decrypt(AES_block blk, AES_key key); method AES_block get_result(); endinterface module mkAESCoresMCD#(Clock slowClock, Reset slowReset) (AESCores#(num_cores)); Reg#(int) ptr <- mkReg(0); Reg#(Bit#(2)) iter <- mkReg(0); Reg#(int) limit <- mkReg(0); Reg#(int) count <- mkReg(0); Reg#(int) rcount <- mkReg(0); AES_key key = {8'hB0, 8'h1D, 8'hFA, 8'hCE, 8'h0D, 8'hEC, 8'h0D, 8'hED, 8'h0B, 8'hA1, 8'h1A, 8'hDE, 8'h0E, 8'hFF, 8'hEC, 8'h70}; Vector#(num_cores, AES) cores <- replicateM(mkAES); let nc_i = fromInteger(valueOf(num_cores)); SyncFIFOIfc#(Bit#(5)) commandQ <- mkSyncFIFOToCC(2,slowClock,slowReset); SyncFIFOIfc#(Bit#(128)) respQ <- mkSyncFIFOFromCC(4,slowClock); rule startRule(iter == 0); if(`AESDebug) $display("Calling start MCD: %d", nc_i); commandQ.deq; iter <= 2; limit <= 1<<commandQ.first(); count <= 0; rcount <= nc_i; ptr <= 0; for(int i = 0; i < nc_i; i=i+1) cores[i].decrypt(pack(zeroExtend(i)), key); endrule rule respRule(iter > 0); if(rcount+1 == limit) // We pre-issue some requests. begin rcount <= 0; end else begin rcount <= rcount + 1; end if(count + 1 == limit) begin iter <= iter-1; count <= 0; end else begin count <= count + 1; end ptr <= (ptr+1 == nc_i)?0:(ptr+1); // ptr tells us which aes core to grab data from cores[ptr].decrypt(pack(zeroExtend(rcount)), key); if(`AESDebug) $display("Count[%d] is %d, reading core %d",nc_i,rcount, ptr); respQ.enq(cores[ptr].get_result()); endrule method Action start(Bit#(5) end_seq) if(commandQ.notFull); commandQ.enq(end_seq); endmethod method ActionValue#(AES_block) get_next() if(respQ.notEmpty); // Must deal with trailing pointer. We issue too many reqs... respQ.deq(); return respQ.first; endmethod endmodule import "BVI" aes_cipher_top = module mkAES (AES); default_clock clk(clk); default_reset rst(rst); method text_out get_result() ready(bsv_done); method decrypt(text_in, key) ready(bsv_done) enable(ld); schedule decrypt CF (get_result); schedule get_result CF (decrypt); schedule decrypt C decrypt; schedule get_result C get_result; endmodule (* synthesize *) module mkAESCores3(AESCores#(3)); AESCores#(3) cores <- mkAESCores(); return cores; endmodule (* synthesize *) module mkAESCores2(AESCores#(2)); AESCores#(2) cores <- mkAESCores(); return cores; endmodule import "BVI" aes_data_fifo = module mkAESDataFIFO#(Clock rdClk, Clock wrClk) (FIFOF#(Bit#(128))); default_clock no_clock; input_clock rd_clk(rd_clk) = rdClk ; // put clock input_clock wr_clk(wr_clk) = wrClk ; // get clock default_reset rst(rst); method enq(din) ready(fullN) enable(wr_en) clocked_by(wr_clk); method emptyN notEmpty() clocked_by(rd_clk); method fullN notFull() clocked_by(wr_clk); method deq() ready(emptyN) enable(rd_en) clocked_by(rd_clk); method dout first() ready(emptyN) clocked_by(rd_clk); method clear() enable(clr) clocked_by(rd_clk); schedule (enq,notFull) CF (deq,first,notEmpty); schedule (notFull,first) CF (notFull,first); schedule (notEmpty,first) CF (notEmpty,first); schedule enq C enq; schedule deq C deq; schedule notEmpty SB deq; schedule first SB deq; schedule notFull SB enq; endmodule import "BVI" aes_command_fifo = module mkAESCommandFIFO#(Clock rdClk, Clock wrClk) (FIFOF#(Bit#(5))); default_clock no_clock; input_clock rd_clk(rd_clk) = rdClk ; // put clock input_clock wr_clk(wr_clk) = wrClk ; // get clock default_reset rst(rst); method enq(din) ready(fullN) enable(wr_en) clocked_by(wr_clk); method emptyN notEmpty() clocked_by(rd_clk); method fullN notFull() clocked_by(wr_clk); method deq() ready(emptyN) enable(rd_en) clocked_by(rd_clk); method dout first() ready(emptyN) clocked_by(rd_clk); method clear() enable(clr) clocked_by(rd_clk); schedule (enq,notFull) CF (deq,first,notEmpty); schedule (notFull,first) CF (notFull,first); schedule (notEmpty,first) CF (notEmpty,first); schedule enq C enq; schedule deq C deq; schedule notEmpty SB deq; schedule first SB deq; schedule notFull SB enq; endmodule module mkTH(); Clock clk <- exposeCurrentClock(); Reset rst <- exposeCurrentReset(); Clock secondClock <- mkAbsoluteClock(3, 3); Reset secondReset <- mkInitialReset(3, clocked_by secondClock); mkTH_mcd(clk,secondClock,rst,secondReset, clocked_by(clk), reset_by(rst)); endmodule module mkTH_mcd#(Clock fastClock, Clock slowClock,Reset fastReset, Reset slowReset) (); AESCores#(2) cores3 <- mkAESCores ; AESCores#(1) cores10 <- mkAESCorePipelined();//mkAESCoresMCD(slowClock,slowReset); Reg#(Bit#(64)) countCycle <- mkReg(0); Reg#(Bool) done <- mkReg(False); Reg#(Bit#(5)) logRecords <- mkReg(4); Reg#(Bit#(20)) recordCount <- mkReg(0); RegFile#(Bit#(18),Bit#(128)) goldenOutput <- mkRegFileFullLoad("code.hex"); Reg#(Bit#(7)) delay <- mkReg(0); rule do_ (!done && logRecords < 19); if(`AESDebug) $display("AES lives"); done <= True; recordCount <= 0; cores3.start(logRecords); cores10.start(logRecords); delay <= 100; endrule rule delayDec(delay > 0); delay <= delay -1; endrule rule countCycleRule; countCycle <= countCycle + 1; endrule rule get (done && recordCount < (1<< logRecords + 1) && delay == 0); let r4 <- cores3.get_next(); let r10 <- cores10.get_next(); recordCount <= recordCount + 1; if(recordCount + 1 == (1<< logRecords + 1)) begin logRecords <= logRecords + 1; done <= False; end let gold = goldenOutput.sub(truncate(recordCount& ((1<<logRecords) - 1))); if(`AESDebug) $display("Value obtained at %d", countCycle); if(r10 != goldenOutput.sub(truncate(recordCount & ((1<<logRecords) - 1)))) begin if(`AESDebug) $display("Cores 10 got %h , expected %h",r10[127:96],gold[127:96]); if(`AESDebug) $display("Cores 10 got %h , expected %h",r10[95:64],gold[95:64]); if(`AESDebug) $display("Cores 10 got %h , expected %h",r10[63:32],gold[63:32]); if(`AESDebug) $display("Cores 10 got %h , expected %h",r10[31:0],gold[31:0]); $finish; end if(r4 != goldenOutput.sub(truncate(recordCount& ((1<<logRecords) - 1)))) begin if(`AESDebug) $display("Cores 4 got %h , expected %h",r4[127:96],gold[127:96]); if(`AESDebug) $display("Cores 4 got %h , expected %h",r4[95:64],gold[95:64]); if(`AESDebug) $display("Cores 4 got %h , expected %h",r4[63:32],gold[63:32]); if(`AESDebug) $display("Cores 4 got %h , expected %h",r4[31:0],gold[31:0]); $finish; end endrule endmodule module mkTH_single(); Reg#(Bool) done <- mkReg(False); AES crypto <- mkAES(); AES_block clear_text = {8'h0, 8'h0, 8'h0, 8'h0, 8'h0, 8'h0, 8'h0, 8'h0, 8'h0, 8'h0, 8'h0, 8'h0, 8'h0, 8'h0, 8'h0, 8'h1}; AES_key globalkey = {8'hB0, 8'h1D, 8'hFA, 8'hCE, 8'h0D, 8'hEC, 8'h0D, 8'hED, 8'h0B, 8'hA1, 8'h1A, 8'hDE, 8'h0E, 8'hFF, 8'hEC, 8'h70}; Stmt test = seq if(`AESDebug) $display("%h", clear_text); crypto.decrypt(clear_text, globalkey); if(`AESDebug) $display("%h",crypto.get_result()); $finish(); endseq; FSM test_fsm <- mkFSM(test); rule do_(!done); test_fsm.start(); done <= True; endrule endmodule 1.1 cryptosorter/memocodeDesignContest2008/aesCore/bsv/aes_core.c http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/aesCore/bsv/aes_core.c?rev=1.1&content-type=text/x-cvsweb-markup Index: aes_core.c =================================================================== /** * MEMOCODE Hardware/Software CoDesign Contest 2008 * * This source file was derived from the public-domain 32-bit version of AES * by the authors as referenced below * * rijndael-alg-fst.c * * @version 3.0 (December 2000) * * Optimised ANSI C code for the Rijndael cipher (now AES) * * @author Vincent Rijmen <vincent.rijmen@e...> * @author Antoon Bosselaers <antoon.bosselaers@e...> * @author Paulo Barreto <paulo.barreto@t...> * * This code is hereby placed in the public domain. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "aes_core.h" static const u32 Te0[256] = { 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, }; static const u32 Te1[256] = { 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, }; static const u32 Te2[256] = { 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, }; static const u32 Te3[256] = { 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, }; static const u32 Te4[256] = { 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, }; static const u32 rcon[] = { 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ }; /** * Expand the cipher key into the encryption key schedule. */ int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key) { u32 *rk; int i = 0; u32 temp; if (!userKey || !key) return -1; if (bits != 128 && bits != 192 && bits != 256) return -2; rk = key->rd_key; if (bits==128) key->rounds = 10; else if (bits==192) key->rounds = 12; else key->rounds = 14; rk[0] = GETU32(userKey ); rk[1] = GETU32(userKey + 4); rk[2] = GETU32(userKey + 8); rk[3] = GETU32(userKey + 12); if (bits == 128) { while (1) { temp = rk[3]; rk[4] = rk[0] ^ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ (Te4[(temp ) & 0xff] & 0x0000ff00) ^ (Te4[(temp >> 24) ] & 0x000000ff) ^ rcon[i]; rk[5] = rk[1] ^ rk[4]; rk[6] = rk[2] ^ rk[5]; rk[7] = rk[3] ^ rk[6]; if (++i == 10) { return 0; } rk += 4; } } rk[4] = GETU32(userKey + 16); rk[5] = GETU32(userKey + 20); if (bits == 192) { while (1) { temp = rk[ 5]; rk[ 6] = rk[ 0] ^ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ (Te4[(temp ) & 0xff] & 0x0000ff00) ^ (Te4[(temp >> 24) ] & 0x000000ff) ^ rcon[i]; rk[ 7] = rk[ 1] ^ rk[ 6]; rk[ 8] = rk[ 2] ^ rk[ 7]; rk[ 9] = rk[ 3] ^ rk[ 8]; if (++i == 8) { return 0; } rk[10] = rk[ 4] ^ rk[ 9]; rk[11] = rk[ 5] ^ rk[10]; rk += 6; } } rk[6] = GETU32(userKey + 24); rk[7] = GETU32(userKey + 28); if (bits == 256) { while (1) { temp = rk[ 7]; rk[ 8] = rk[ 0] ^ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ (Te4[(temp ) & 0xff] & 0x0000ff00) ^ (Te4[(temp >> 24) ] & 0x000000ff) ^ rcon[i]; rk[ 9] = rk[ 1] ^ rk[ 8]; rk[10] = rk[ 2] ^ rk[ 9]; rk[11] = rk[ 3] ^ rk[10]; if (++i == 7) { return 0; } temp = rk[11]; rk[12] = rk[ 4] ^ (Te4[(temp >> 24) ] & 0xff000000) ^ (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(temp ) & 0xff] & 0x000000ff); rk[13] = rk[ 5] ^ rk[12]; rk[14] = rk[ 6] ^ rk[13]; rk[15] = rk[ 7] ^ rk[14]; rk += 8; } } return 0; } void AES_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key) { const u32 *rk; u32 s0, s1, s2, s3, t0, t1, t2, t3; int r; rk = key->rd_key; /* * map byte array block to cipher state * and add initial round key: */ s0 = GETU32(in ) ^ rk[0]; s1 = GETU32(in + 4) ^ rk[1]; s2 = GETU32(in + 8) ^ rk[2]; s3 = GETU32(in + 12) ^ rk[3]; /* * Nr - 1 full rounds: */ r = key->rounds >> 1; for (;;) { t0 = Te0[(s0 >> 24) ] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[(s3 ) & 0xff] ^ rk[4]; t1 = Te0[(s1 >> 24) ] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[(s0 ) & 0xff] ^ rk[5]; t2 = Te0[(s2 >> 24) ] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[(s1 ) & 0xff] ^ rk[6]; t3 = Te0[(s3 >> 24) ] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[(s2 ) & 0xff] ^ rk[7]; rk += 8; if (--r == 0) { break; } s0 = Te0[(t0 >> 24) ] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[(t3 ) & 0xff] ^ rk[0]; s1 = Te0[(t1 >> 24) ] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[(t0 ) & 0xff] ^ rk[1]; s2 = Te0[(t2 >> 24) ] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[(t1 ) & 0xff] ^ rk[2]; s3 = Te0[(t3 >> 24) ] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[(t2 ) & 0xff] ^ rk[3]; } /* * apply last round and * map cipher state to byte array block: */ s0 = (Te4[(t0 >> 24) ] & 0xff000000) ^ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t3 ) & 0xff] & 0x000000ff) ^ rk[0]; PUTU32(out , s0); s1 = (Te4[(t1 >> 24) ] & 0xff000000) ^ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t0 ) & 0xff] & 0x000000ff) ^ rk[1]; PUTU32(out + 4, s1); s2 = (Te4[(t2 >> 24) ] & 0xff000000) ^ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t1 ) & 0xff] & 0x000000ff) ^ rk[2]; PUTU32(out + 8, s2); s3 = (Te4[(t3 >> 24) ] & 0xff000000) ^ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t2 ) & 0xff] & 0x000000ff) ^ rk[3]; PUTU32(out + 12, s3); } 1.1 cryptosorter/memocodeDesignContest2008/aesCore/bsv/aes_core.h http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/aesCore/bsv/aes_core.h?rev=1.1&content-type=text/x-cvsweb-markup Index: aes_core.h =================================================================== /** * MEMOCODE Hardware/Software CoDesign Contest 2008 * * This source file was derived from the public-domain 32-bit version of AES * by the authors as referenced below * * rijndael-alg-fst.c * * @version 3.0 (December 2000) * * Optimised ANSI C code for the Rijndael cipher (now AES) * * @author Vincent Rijmen <vincent.rijmen@e...> * @author Antoon Bosselaers <antoon.bosselaers@e...> * @author Paulo Barreto <paulo.barreto@t...> * * This code is hereby placed in the public domain. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef AES_CORE_H #define AES_CORE_H #define AES_MAXNR 10 #define AES_BLOCK_SIZE 16 struct aes_key_st { unsigned int rd_key[4 *(AES_MAXNR + 1)]; int rounds; }; typedef struct aes_key_st AES_KEY; typedef unsigned int u32; typedef unsigned char u8; int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key); void AES_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key); # define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3])) # define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); } #endif 1.1 cryptosorter/memocodeDesignContest2008/aesCore/bsv/mkAESCores2.sched http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/aesCore/bsv/mkAESCores2.sched?rev=1.1&content-type=text/x-cvsweb-markup Index: mkAESCores2.sched =================================================================== === Generated schedule for mkAESCores2 === Method schedule --------------- Method: start Ready signal: cores_commandQ.i_notFull Conflict-free: get_next Conflicts: start Method: get_next Ready signal: cores_respQ.i_notEmpty Conflict-free: start Conflicts: get_next Rule schedule ------------- Rule: cores_respRule Predicate: cores_respQ.i_notFull && ((cores_ptr == 32'd0) ? cores_cores.RDY_decrypt : ((! (cores_ptr == 32'd1)) || cores_cores_1.RDY_decrypt)) && ((cores_ptr == 32'd0) ? cores_cores.RDY_get_result : ((! (cores_ptr == 32'd1)) || cores_cores_1.RDY_get_result)) && (! (cores_iter == 2'd0)) Blocking rules: (none) Rule: cores_startRule Predicate: cores_cores.RDY_decrypt && cores_cores_1.RDY_decrypt && cores_commandQ.i_notEmpty && (cores_iter == 2'd0) Blocking rules: (none) Logical execution order: get_next, start, cores_respRule, cores_startRule =========================================== 1.1 cryptosorter/memocodeDesignContest2008/aesCore/bsv/mkAESCores3.sched http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/aesCore/bsv/mkAESCores3.sched?rev=1.1&content-type=text/x-cvsweb-markup Index: mkAESCores3.sched =================================================================== === Generated schedule for mkAESCores3 === Method schedule --------------- Method: start Ready signal: cores_commandQ.i_notFull Conflict-free: get_next Conflicts: start Method: get_next Ready signal: cores_respQ.i_notEmpty Conflict-free: start Conflicts: get_next Rule schedule ------------- Rule: cores_respRule Predicate: cores_respQ.i_notFull && ((cores_ptr == 32'd0) ? cores_cores.RDY_decrypt : ((cores_ptr == 32'd1) ? cores_cores_1.RDY_decrypt : ((! (cores_ptr == 32'd2)) || cores_cores_2.RDY_decrypt))) && ((cores_ptr == 32'd0) ? cores_cores.RDY_get_result : ((cores_ptr == 32'd1) ? cores_cores_1.RDY_get_result : ((! (cores_ptr == 32'd2)) || cores_cores_2.RDY_get_result))) && (! (cores_iter == 2'd0)) Blocking rules: (none) Rule: cores_startRule Predicate: cores_cores.RDY_decrypt && cores_cores_1.RDY_decrypt && cores_cores_2.RDY_decrypt && cores_commandQ.i_notEmpty && (cores_iter == 2'd0) Blocking rules: (none) Logical execution order: get_next, start, cores_respRule, cores_startRule =========================================== 1.1 cryptosorter/memocodeDesignContest2008/aesCore/bsv/reference_cipher.c http://www.opencores.org/cvsweb.shtml/cryptosorter/memocodeDesignContest2008/aesCore/bsv/reference_cipher.c?rev=1.1&content-type=text/x-cvsweb-markup Index: reference_cipher.c =================================================================== #include "aes_core.h" #include <assert.h> #include <stdio.h> static AES_KEY db_encrypt_key; const unsigned char globalkey[] = {0xB0, 0x1D, 0xFA, 0xCE, 0x0D, 0xEC, 0x0D, 0xED, 0x0B, 0xA1, 0x1A, 0xDE, 0x0E, 0xFF, 0xEC, 0x70}; void encrypt(){ FILE *outplain, *outcodeword; const int bound = 1 << 18; static unsigned char plaindata[16] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; unsigned char cryptdata[16]; int i,j; assert(outplain = fopen("plain.hex","w")); assert(outcodeword = fopen("code.hex","w")); AES_set_encrypt_key(globalkey, 128, &db_encrypt_key); for (j=0; j<bound; j++) { PUTU32(plaindata+12, j); AES_encrypt(plaindata, cryptdata, &db_encrypt_key); fprintf(outplain,"%08x%08x%08x%08x\n", GETU32(plaindata + 0),GETU32(plaindata + 4),GETU32(plaindata + 8),GETU32(plaindata + 12)); fprintf(outcodeword,"%08x%08x%08x%08x\n",GETU32(cryptdata + 0),GETU32(cryptdata + 4),GETU32(cryptdata + 8),GETU32(cryptdata + 12)); } } #ifdef EXECUTABLE int main(){ encrypt(); return 0; } #endif

     
    Copyright (c) 1999 OPENCORES.ORG. All rights reserved.