URL
https://opencores.org/ocsvn/xgate/xgate/trunk
Subversion Repositories xgate
Compare Revisions
- This comparison shows the changes necessary to convert path
/xgate
- from Rev 80 to Rev 81
- ↔ Reverse comparison
Rev 80 → Rev 81
/trunk/sw/tools/HSW12ASM/README.txt
1,10 → 1,11
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 |
Sept 1, 2009 |
August 10, 2010 |
|
The hsw12asm assembler was used to create the object code srecord files for |
the test cases. This assembler is written in Perl so it should be usable on |
most computer systems. I don't plan on trying a copy as part of this project |
but please see to sites below for the most recent versions to download. |
most computer systems. I don't plan on tieing a specific copy or version to |
this project but please see the sites below for the most recent version |
to download and use. |
|
Documentation: |
http://home.arcor.de/hotwolf/hsw12asm.html |
/trunk/sw/applications/skipjack-1.01/skipjack.s
0,0 → 1,491
; 345678901234567890123456789012345678901234567890123456789012345678901234567890 |
; Copyright (c) 2010, Robert Hayes |
; SKIPJACK ENCRYPT/DECRYPT for xgate RISC processor core |
; Bob Hayes - August 7, 2010 |
; Version 0.1 Basic SKIPJACK Encrypt and Decrypt modules for the Xgate |
; processor. These routines do the basic codebook encrypt and decrypt |
; functions, other modes of use such as output feedback,cipher feedback and |
; cipher block chaining can be added at the host code level or the routines |
; could be expanded to incorporate the required functionality. |
|
; This implementation is believed to be compliant with the SKIPJACK algorithm |
; as described in "SKIPJACK and KEA Algorithm Specifications" Version 2.0 |
; dated 29 May 1998, which is available from the National Institute for |
; Standards and Technology: |
; http://csrc.nist.gov/groups/STM/cavp/documents/skipjack/skipjack.pdf |
|
; |
; This source file is free software: you can redistribute it and/or modify |
; it under the terms of the GNU Lesser General Public License as published |
; by the Free Software Foundation, either version 3 of the License, or |
; (at your option) any later version. |
; |
; Supplemental terms. |
; * Redistributions of source code must retain the above copyright |
; notice, this list of conditions and the following disclaimer. |
; * Neither the name of the <organization> nor the |
; names of its contributors may be used to endorse or promote products |
; derived from this software without specific prior written permission. |
; |
; THIS SOFTWARE IS PROVIDED BY Robert Hayes ''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 Robert Hayes 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. |
; |
; You should have received a copy of the GNU General Public License |
; along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
CPU XGATE |
|
ORG $fe00 |
DS.W 2 ; reserve two words at channel 0, always unused for thread |
; channel 1 |
DC.W SK_ENCRYPT ; point to start address |
DC.W ROUND_E ; point to initial variables (Loaded into R1) |
; channel 2 |
DC.W SK_DECRYPT ; point to start address |
DC.W ROUND_D ; point to initial variables (Loaded into R1) |
; channel 3 |
DC.W _ERROR ; point to start address |
DC.W V_PTR ; point to initial variables |
|
|
ORG $2000 ; Setup a data storage area |
|
V_PTR EQU 123 |
|
|
;------------------------------------------------------------------------------- |
; Constants used for offset caculations from R1 of SKIPJACK RAM variables. |
; These offsets are used by both encrypt and decrypt routines. |
;------------------------------------------------------------------------------- |
SK_ROUND EQU 0 |
SK_W1 EQU 2 |
SK_W2 EQU 4 |
SK_W3 EQU 6 |
SK_W4 EQU 8 |
SK_KEY1 EQU 10 |
SK_KEY2 EQU 12 |
SK_KEY3 EQU 14 |
SK_KEY4 EQU 16 |
SK_KEY5 EQU 18 |
SK_KEY_P EQU 20 |
SK_F_P EQU 22 |
|
;------------------------------------------------------------------------------- |
; RAM Variables for Skipjack Encryption |
;------------------------------------------------------------------------------- |
ROUND_E DC.W $55aa ; R1+0 |
PT DC.B $33,$22,$11,$00,$dd,$cc,$bb,$aa ; R1+2 |
KEYE_N DS.W 5 ; R1+10 |
KEYE_PTR DS.W 1 ; R1+20 |
F_PTR_E DC.W F_TABLE ; R1+22 |
|
KEY DC.B $99,$00,$77,$88,$55,$66,$33,$44,$11,$22 |
; R1 can only be used to explictly address the first 32 bytes |
|
|
;------------------------------------------------------------------------------- |
; Variables for Skipjack Decryption |
;------------------------------------------------------------------------------- |
ALIGN 1 |
ROUND_D DC.W $55aa ; R1+0 |
CT DC.B $25,$87,$ca,$e2,$7a,$12,$d3,$00 ; R1+2 |
KEYD_N DS.W 5 ; R1+10 |
KEYD_PTR DS.W 1 ; R1+20 |
F_PTR_D DC.W F_TABLE ; R1+22 |
|
KEYD DC.B $99,$00,$77,$88,$55,$66,$33,$44,$11,$22 |
; R1 can only be used to explictly address the first 32 bytes |
|
ALIGN 1 |
|
;------------------------------------------------------------------------------- |
; Place where undefined interrupts go |
;------------------------------------------------------------------------------- |
_ERROR |
LDL R2,#$04 ; Sent Message to Testbench Error Register |
LDH R2,#$80 |
LDL R3,#$ff |
STB R3,(R2,#0) |
|
SIF |
RTS |
|
|
;------------------------------------------------------------------------------- |
; Skipjack Encryption |
;------------------------------------------------------------------------------- |
SK_ENCRYPT |
;--- Only used for testbench, Delete for production release -------------------- |
LDL R2,#$00 ; Sent Message to Testbench Check Point Register |
LDH R2,#$80 |
LDL R3,#$01 |
STB R3,(R2,#0) |
STB R3,(R2,#2) ; Send Message to clear Testbench interrupt register |
;------------------------------------------------------------------------------- |
|
; Copy and invert key so we can use the native XNOR functions |
; Because this is only required to be done once the Host may implement |
; the key inversion and then this code could be deleted. |
LDL R3,#KEY |
LDH R3,#KEY>>8 ; R3 is address of KEY |
|
LDW R6,(R3,#0) |
COM R6 |
STW R6,(R1,#SK_KEY1) |
LDW R6,(R3,#2) |
COM R6 |
STW R6,(R1,#SK_KEY2) |
LDW R6,(R3,#4) |
COM R6 |
STW R6,(R1,#SK_KEY3) |
LDW R6,(R3,#6) |
COM R6 |
STW R6,(R1,#SK_KEY4) |
LDW R6,(R3,#8) |
COM R6 |
STW R6,(R1,#SK_KEY5) |
|
; The following code to initialize the F Table pointer could be done by the host |
; to save a few cycles of execution since it is only needed to be done once. |
LDL R5,#F_TABLE |
LDH R5,#F_TABLE>>8 ; R5 is address of F Table Pointer |
STW R5,(R1,#SK_F_P) ; Save F Table Pointer |
|
; Start of the SKIPJACK encrypt code |
AND R3,R3,R0 ; Clear R3 |
STW R3,(R1,#SK_ROUND) ; Save initial Round Counter |
LDL R3,#SK_KEY1 ; Set the initial Key counter value |
STW R3,(R1,#SK_KEY_P) ; Save Key counter initial value |
|
SKE_LOOP: |
LDW R3,(R1,#SK_KEY_P) ; Get Key Counter value |
LDW R7,(R1,R3+) ; Get word of Key |
CMPL R3,#(SK_KEY5+2) ; Check for rollover |
BNE SKE_K1_OK ; Branch if rollover |
LDL R3,#SK_KEY1 ; Set the initial Key counter value |
|
SKE_K1_OK: |
STW R3,(R1,#SK_KEY_P) ; Save Key Pointer |
LDW R5,(R1,#SK_F_P) ; Get F Table Base Address |
LDL R4,#$70 ; Set Bitfield extract field |
LDW R6,(R1,#SK_W1) ; Get W1 |
TFR R2,PC ; Subroutine Call |
BRA CALC_G |
|
LDW R3,(R1,#SK_KEY_P) ; Get Key Counter |
LDW R7,(R1,R3+) ; Get word of Key |
CMPL R3,#(SK_KEY5+2) ; Check for rollover |
BNE SKE_K2_OK ; Branch if not rollover |
LDL R3,#SK_KEY1 ; Set the initial Key counter value |
|
SKE_K2_OK: |
STW R3,(R1,#SK_KEY_P) ; Save Key Pointer |
TFR R2,PC ; Subroutine Call |
BRA CALC_G |
|
LDW R3,(R1,#SK_ROUND) ; Load Round Counter |
BITL R3,#8 ; |
BNE SKE_RUL_B ; Do rule B when bit 3 of round counter is set |
|
SKE_RUL_A: |
ADDL R3,#1 ; Update the Round Counter |
LDW R5,(R1,#SK_W4) ; Get W4 |
XNOR R5,R6,R5 |
XNOR R5,R5,R3 ; XOR the Round counter |
LDW R7,(R1,#SK_W2) ; Load W2=NEXT_W3 |
BRA SKE_SHIFT ; R5=NEXT_W1, R6=NEXT_W2, R7=NEXT_W3 |
|
SKE_RUL_B: |
ADDL R3,#1 ; Update Round Counter |
LDW R7,(R1,#SK_W1) ; Get W1 |
XNOR R7,R7,R3 ; XNOR W1 and Round Counter |
LDW R5,(R1,#SK_W2) ; Load W2 |
XNOR R7,R5,R7 ; XNOR previous result with W2 |
LDW R5,(R1,#SK_W4) ; Load W4=NEXT_W1 |
|
SKE_SHIFT: |
STW R3,(R1,#SK_ROUND) ; Save the Round Counter |
STW R5,(R1,#SK_W1) ; Store New W1 |
STW R6,(R1,#SK_W2) ; Store New W2 |
LDW R6,(R1,#SK_W3) ; Load W3 |
STW R6,(R1,#SK_W4) ; Store New W4 |
STW R7,(R1,#SK_W3) ; Store New W3 |
|
CMPL R3,#31 ; Check for last round |
BRKP_3 BLS SKE_LOOP |
|
|
;--- Only used for testbench, Delete for production release -------------------- |
LDL R2,#$00 ; Sent Message to Testbench Check Point Register |
LDH R2,#$80 |
LDL R3,#$02 |
STB R3,(R2,#0) |
;------------------------------------------------------------------------------- |
|
SIF |
RTS |
|
|
CALC_G |
BFEXT R3,R6,R4 ; Copy low byte of W1 to R3 |
BFINSX R3,R7,R4 ; XNOR the low byte of W1 with the low byte of KEY_N |
ADD R3,R3,R5 ; Caculate full F Table byte address |
LDB R3,(R3,#0) ; Get F Table output |
ROL R6,#8 ; Move the high byte of W1 to the low byte of R6 |
BFINSX R6,R3,R4 ; XNOR the high byte of W1 with the F table output |
BFINS R3,R6,R4 ; Copy low byte |
ROL R6,#8 ; Put low byte of W1 back to the low byte of R6 |
|
ROL R7,#8 ; Move the high byte of KEY_N to the low byte of R7 |
BFINSX R3,R7,R4 ; XNOR temp with the high byte of KEY_N |
|
ANDH R3,#0 ; Clear R3 high byte |
ADD R3,R3,R5 ; Caculate full F Table byte address |
LDB R3,(R3,#0) ; Get F Table output |
BFINSX R6,R3,R4 ; XNOR the low byte of W1 with the F table output |
|
JAL R2 ; Jump to return address |
|
|
;------------------------------------------------------------------------------- |
; Skipjack Decryption |
;------------------------------------------------------------------------------- |
SK_DECRYPT |
;--- Only used for testbench, Delete for production release -------------------- |
LDL R2,#$00 ; Sent Message to Testbench Check Point Register |
LDH R2,#$80 |
LDL R3,#$02 |
STB R3,(R2,#0) |
STB R3,(R2,#2) ; Send Message to clear Testbench interrupt register |
;------------------------------------------------------------------------------- |
|
; Copy and invert key so we can use the native XNOR functions |
; Because this is only required to be done once the Host may implement |
; the key inversion and then this code could be deleted. |
LDL R3,#KEYD |
LDH R3,#KEYD>>8 ; R3 is address of KEY |
|
LDW R6,(R3,#0) |
COM R6 |
STW R6,(R1,#SK_KEY1) |
LDW R6,(R3,#2) |
COM R6 |
STW R6,(R1,#SK_KEY2) |
LDW R6,(R3,#4) |
COM R6 |
STW R6,(R1,#SK_KEY3) |
LDW R6,(R3,#6) |
COM R6 |
STW R6,(R1,#SK_KEY4) |
LDW R6,(R3,#8) |
COM R6 |
STW R6,(R1,#SK_KEY5) |
|
; The following code to initialize the F Table pointer could be done by the host |
; to save a few cycles of execution since it is only needed to be done once. |
LDL R5,#F_TABLE |
LDH R5,#F_TABLE>>8 ; R5 is address of F Table Pointer |
STW R5,(R1,#SK_F_P) ; Save F Table Pointer |
|
; Start of the SKIPJACK decrypt code |
LDL R3,#32 ; |
STW R3,(R1,#SK_ROUND) ; Save initial Round Counter |
LDL R3,#SK_KEY5 ; Set the initial Key counter value |
STW R3,(R1,#SK_KEY_P) ; Save Key counter initial value |
|
SKD_LOOP: |
LDW R3,(R1,#SK_KEY_P) ; Get Key Counter value |
LDW R7,(R1,-R3) ; Get word of Key |
CMPL R3,#(SK_KEY1) ; Check for rollover |
BNE SKD_K1_OK ; Branch if rollover |
LDL R3,#(SK_KEY5+2) ; Set the initial Key counter value |
|
SKD_K1_OK: |
STW R3,(R1,#SK_KEY_P) ; Save Key Pointer |
LDW R5,(R1,#SK_F_P) ; Get F Table Base Address |
LDL R4,#$70 ; Set Bitfield extract field |
LDW R6,(R1,#SK_W2) ; Get W2 |
TFR R2,PC ; Subroutine Call |
BRA CALC_GN |
|
LDW R3,(R1,#SK_KEY_P) ; Get Key Counter |
LDW R7,(R1,-R3) ; Get word of Key |
CMPL R3,#(SK_KEY1) ; Check for rollover |
BNE SKD_K2_OK ; Branch if not rollover |
LDL R3,#(SK_KEY5+2) ; Set the initial Key counter value |
|
SKD_K2_OK: |
STW R3,(R1,#SK_KEY_P) ; Save Key Pointer |
TFR R2,PC ; Subroutine Call |
BRA CALC_GN ; Return with the new W1 in R6 |
|
LDW R3,(R1,#SK_ROUND) ; Load Round Counter |
MOV R4,R3 ; Copy R3 to R4 |
SUBL R4,#1 ; New Round Counter used to pick Rule A or B |
BITL R4,#8 ; |
BNE SKD_RUL_B ; Do rule B when bit 3 of round counter is set |
|
SKD_RUL_A: |
LDW R5,(R1,#SK_W2) ; Get W2 |
LDW R2,(R1,#SK_W1) ; Get W1 |
XNOR R5,R2,R5 |
XNOR R5,R5,R3 ; XOR the Round counter |
LDW R7,(R1,#SK_W3) ; Load R7=NEXT_W2 |
BRA SKD_SHIFT ; R6=NEXT_W1, R7=NEXT_W2, R5=NEXT_W4 |
|
SKD_RUL_B: |
LDW R5,(R1,#SK_W3) ; Get W3 |
XNOR R7,R6,R3 ; XNOR G and Round Counter |
XNOR R7,R7,R5 ; XNOR W3 R7=NEXT_W2 |
LDW R5,(R1,#SK_W1) ; Load R5=NEXT_W4 |
|
SKD_SHIFT: |
STW R4,(R1,#SK_ROUND) ; Save the Round Counter |
STW R6,(R1,#SK_W1) ; Store New W1 |
LDW R6,(R1,#SK_W4) ; Load W4 |
STW R6,(R1,#SK_W3) ; Store New W3 |
STW R7,(R1,#SK_W2) ; Store New W2 |
STW R5,(R1,#SK_W4) ; Store New W4 |
|
CMPL R4,#1 |
BRKP_1 BHS SKD_LOOP |
|
|
;--- Only used for testbench, Delete for production release -------------------- |
LDL R2,#$00 ; Sent Message to Testbench Check Point Register |
LDH R2,#$80 |
LDL R3,#$02 |
STB R3,(R2,#0) |
;------------------------------------------------------------------------------- |
SIF |
RTS |
|
|
CALC_GN |
BRKP_2 ROL R7,#8 ; Flip bytes of KEY_N |
ROL R6,#8 ; Flip bytes of W2 |
BFEXT R3,R6,R4 ; Copy high byte of W2 to R3 |
BFINSX R3,R7,R4 ; XNOR the high byte of W2 with the high byte of KEY_N |
ADD R3,R3,R5 ; Caculate full F Table byte address |
LDB R3,(R3,#0) ; Get F Table output |
ROL R6,#8 ; Swap the bytes of W2 back to starting place |
BFINSX R6,R3,R4 ; XNOR the low byte of W2 with the F table output |
|
ROL R7,#8 ; Flip bytes of KEY_N back to starting place |
BFEXT R3,R6,R4 ; Copy low byte of W2 to R3 |
BFINSX R3,R7,R4 ; XNOR W2 final with the low byte of KEY_N |
|
ADD R3,R3,R5 ; Caculate full F Table byte address |
LDB R3,(R3,#0) ; Get F Table output |
ROL R6,#8 ; Put high byte of W2 to the low byte of R6 |
BFINSX R6,R3,R4 ; XNOR the high byte of W2 with the F table output |
ROL R6,#8 ; Put high byte of W2 back to the high byte of R6 |
|
JAL R2 ; Jump to return address |
|
;------------------------------------------------------------------------------- |
;------------------------------------------------------------------------------- |
;------------------------------------------------------------------------------- |
|
; Note locations in the $8000 range are used by the testbench |
|
ORG $8040 |
|
; These memory locations are read by the testbench debugger to trigger |
; register captures when the saved address if used |
BREAK_CAPT_0 DC.W SKD_K1_OK |
BREAK_CAPT_1 DC.W BRKP_1 |
BREAK_CAPT_2 DC.W BRKP_2 |
BREAK_CAPT_3 DC.W $0000 |
BREAK_CAPT_4 DC.W SKE_LOOP |
BREAK_CAPT_5 DC.W BRKP_3 |
BREAK_CAPT_6 DC.W SKD_LOOP |
BREAK_CAPT_7 DC.W BRKP_1 |
|
ORG $9000 |
|
; This is the inverted F Table that is used by the G Function |
F_TABLE: |
DC.B $5C,$28,$F6,$7C,$07,$B7,$09,$0B |
DC.B $4C,$DE,$EA,$87,$66,$4E,$50,$06 |
DC.B $18,$D2,$B2,$75,$31,$B3,$35,$D1 |
DC.B $AD,$6A,$26,$E1,$B1,$C7,$BB,$D7 |
DC.B $F5,$20,$FD,$5F,$E8,$0E,$9F,$97 |
DC.B $ED,$48,$85,$3C,$16,$05,$C2,$AC |
DC.B $69,$7B,$94,$45,$0D,$9C,$65,$E6 |
DC.B $83,$51,$1A,$0A,$08,$E9,$95,$5D |
DC.B $C6,$49,$84,$F0,$3E,$6C,$7E,$E4 |
DC.B $11,$4B,$E5,$15,$2F,$6E,$D0,$47 |
DC.B $AA,$46,$25,$7A,$C0,$BE,$40,$1F |
DC.B $A5,$A7,$7F,$A0,$99,$F4,$27,$6F |
DC.B $CA,$2A,$3F,$58,$CC,$F9,$9A,$96 |
DC.B $BA,$FF,$6B,$A9,$92,$67,$64,$89 |
DC.B $68,$03,$4D,$3D,$4F,$01,$24,$DF |
DC.B $1E,$14,$29,$1B,$22,$B8,$B5,$E2 |
DC.B $BD,$12,$61,$91,$B6,$C3,$32,$BC |
DC.B $D8,$2D,$F8,$2B,$21,$38,$98,$E7 |
DC.B $76,$34,$CF,$E0,$72,$39,$70,$55 |
DC.B $37,$8B,$23,$36,$A2,$A3,$CE,$5B |
DC.B $8F,$77,$9E,$D3,$60,$F2,$D4,$78 |
DC.B $AF,$7D,$AB,$9B,$D9,$82,$FC,$BF |
DC.B $CB,$B4,$E3,$8C,$2E,$3B,$02,$C4 |
DC.B $33,$04,$80,$54,$19,$C1,$A4,$5A |
DC.B $52,$FB,$DC,$63,$EB,$AE,$DD,$0F |
DC.B $D6,$86,$8E,$81,$00,$73,$F1,$1D |
DC.B $F3,$10,$43,$8D,$8A,$90,$C8,$5E |
DC.B $13,$2C,$71,$9D,$74,$79,$EF,$17 |
DC.B $F7,$88,$EE,$41,$6D,$B0,$DB,$3A |
DC.B $CD,$C9,$62,$30,$0C,$59,$44,$53 |
DC.B $A1,$93,$56,$EC,$A8,$DA,$4A,$1C |
DC.B $42,$57,$C5,$FE,$FA,$A6,$D5,$B9 |
|
;------------------------------------------------------------------------------- |
; This is the un-inverted F Table and it is included for reference only |
; Not required |
DC.B $a3,$d7,$09,$83,$f8,$48,$f6,$f4 |
DC.B $b3,$21,$15,$78,$99,$b1,$af,$f9 |
DC.B $e7,$2d,$4d,$8a,$ce,$4c,$ca,$2e |
DC.B $52,$95,$d9,$1e,$4e,$38,$44,$28 |
DC.B $0a,$df,$02,$a0,$17,$f1,$60,$68 |
DC.B $12,$b7,$7a,$c3,$e9,$fa,$3d,$53 |
DC.B $96,$84,$6b,$ba,$f2,$63,$9a,$19 |
DC.B $7c,$ae,$e5,$f5,$f7,$16,$6a,$a2 |
DC.B $39,$b6,$7b,$0f,$c1,$93,$81,$1b |
DC.B $ee,$b4,$1a,$ea,$d0,$91,$2f,$b8 |
DC.B $55,$b9,$da,$85,$3f,$41,$bf,$e0 |
DC.B $5a,$58,$80,$5f,$66,$0b,$d8,$90 |
DC.B $35,$d5,$c0,$a7,$33,$06,$65,$69 |
DC.B $45,$00,$94,$56,$6d,$98,$9b,$76 |
DC.B $97,$fc,$b2,$c2,$b0,$fe,$db,$20 |
DC.B $e1,$eb,$d6,$e4,$dd,$47,$4a,$1d |
DC.B $42,$ed,$9e,$6e,$49,$3c,$cd,$43 |
DC.B $27,$d2,$07,$d4,$de,$c7,$67,$18 |
DC.B $89,$cb,$30,$1f,$8d,$c6,$8f,$aa |
DC.B $c8,$74,$dc,$c9,$5d,$5c,$31,$a4 |
DC.B $70,$88,$61,$2c,$9f,$0d,$2b,$87 |
DC.B $50,$82,$54,$64,$26,$7d,$03,$40 |
DC.B $34,$4b,$1c,$73,$d1,$c4,$fd,$3b |
DC.B $cc,$fb,$7f,$ab,$e6,$3e,$5b,$a5 |
DC.B $ad,$04,$23,$9c,$14,$51,$22,$f0 |
DC.B $29,$79,$71,$7e,$ff,$8c,$0e,$e2 |
DC.B $0c,$ef,$bc,$72,$75,$6f,$37,$a1 |
DC.B $ec,$d3,$8e,$62,$8b,$86,$10,$e8 |
DC.B $08,$77,$11,$be,$92,$4f,$24,$c5 |
DC.B $32,$36,$9d,$cf,$f3,$a6,$bb,$ac |
DC.B $5e,$6c,$a9,$13,$57,$25,$b5,$e3 |
DC.B $bd,$a8,$3a,$01,$05,$59,$2a,$46 |
;------------------------------------------------------------------------------- |
|
|
_BENCH DS.W 8 |
|
|
/trunk/sw/applications/skipjack-1.01/README.txt
0,0 → 1,37
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 |
Bob Hayes -- August 10, 2010 |
|
SKIPJACK ENCRYPT/DECRYPT for xgate RISC processor core |
|
Version 0.1 Basic SKIPJACK Encrypt and Decrypt modules for the Xgate |
processor. These routines do the basic codebook encrypt and decrypt |
functions, other modes of use such as output feedback,cipher feedback and |
cipher block chaining can be added at the host code level or the routines |
could be expanded to incorporate the required functionality. |
|
This implementation is believed to be compliant with the SKIPJACK algorithm |
as described in "SKIPJACK and KEA Algorithm Specifications" Version 2.0 |
dated 29 May 1998, which is available from the National Institute for |
Standards and Technology: |
http://csrc.nist.gov/groups/STM/cavp/documents/skipjack/skipjack.pdf |
|
The algorithm encrypts a 64 bit block of data with an 80 bit key running |
through the encryption loop 32 times. The encrypt/decrypt function has been |
verified by running the key and plain text and cypher test given in the |
specification document.(Some have noted that this only verifies about half |
of the entries in the F Table.) |
|
Basic encryption process takes approx. 6468 cycles |
Basic decryption process takes approx. 6786 cycles |
|
The code has several sections that are only needed for the Verilog test bench |
and can be deleted in normal use. There is also some additional initialization |
code that only needs to be done once and could be replaced by the host putting |
the correct values in the appropriate RAM locations. These sections are marked |
in the code. The starting address of the F Table in memory shouldn't be critical |
although starting on a 256 byte boundary is convenient for debugging. The |
algorithm variables use 8 bit address offset calculations so care should be |
taken if the key is saved in a memory range that crosses an 8 bit addressing |
boundary. |
|
|
/trunk/sw/applications/skipjack-1.01/make_core.scr
0,0 → 1,3
../../tools/HSW12ASM/hsw12asm.pl skipjack.s |
../../tools/s_2_verilog skipjack_pag.s28 |
mv skipjack_pag.v ../../../bench/verilog/skipjack.v |
trunk/sw/applications/skipjack-1.01/make_core.scr
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property