Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

help with lookup table

Status
Not open for further replies.

krpz

New Member
i try to implement an aes encryption on a pic16f877,
i stuck in the SubBytes step https://en.wikipedia.org/wiki/Advanced_Encryption_Standard#The_SubBytes_step


i want to implement the rijndael lookup table in asm :
https://en.wikipedia.org/wiki/Rijndael_S-box

above is the lookup table:
Code:
   | 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
---|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
0  |63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76 
1  |ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0 
2  |b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15 
3  |04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75 
4  |09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84 
5  |53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf 
6  |d0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8 
7  |51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2 
8  |cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73 
9  |60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db 
a  |e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79 
b  |e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08 
c0 |ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a 
d0 |70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e 
e0 |e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df 
f0 |8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16

for example if my Wreg= 0x19
then after subbytes step Wreg=0xd4
1:rows
9: columns

is there a way to implement this in asm?? thanks in advance

here is a graphic explanation for more help https://www.formaestudio.com/rijndaelinspector/archivos/rijndaelanimation.html
 
is there a way to implement this in asm?

Yes... Call the routine with your table index of 0x00..0xFF in WREG...

Code:
getaes
        addlw   tbl%256         ; add wreg index, 0x00..0xFF, to table address
        movwf   PTRL            ;
        movlw   tbl/256         ;
        skpnc                   ;
        addlw   1               ;
        movwf   PCLATH          ;
        movf    PTRL,W          ;
        movwf   PCL             ;
tbl
        dt      0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76
        dt      0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0
        dt      0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15
        dt      0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75
        dt      0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84
        dt      0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf
        dt      0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8
        dt      0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2
        dt      0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73
        dt      0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb
        dt      0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79
        dt      0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08
        dt      0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a
        dt      0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e
        dt      0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf
        dt      0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16

The same function on an enhanced mid-range device like a 16F1937 would only use six instruction cycles to execute and would look like this;

Code:
getaes
        brw                     ; branch (wreg index)
        dt      0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76
        dt      0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0
        dt      0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15
        dt      0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75
        dt      0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84
        dt      0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf
        dt      0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8
        dt      0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2
        dt      0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73
        dt      0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb
        dt      0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79
        dt      0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08
        dt      0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a
        dt      0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e
        dt      0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf
        dt      0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16
 
thank you my friend for your quick response. :)

i try to make this work, but i have a question, sory if this is a noob question.
what did you mean by : addlw tbl%256
mplab says: operand contains unresolvable labels or is too complex,
,the same and for: movlw tbl/256
 
Mike is loading your higher byte of offset to PCLATH & lower byte to PCL

See if this works!!
Load your offset to Offset_H & Offset_L

Code:
getaes	movlw	High tbl		;perform read from long table
	addwf	Offset_H,W
	movwf	PCLATH
	movlw	Low tbl
	addwf	Offset_L,W
	btfsc   STATUS,C
	incf	PCLATH,F
	movwf	PCL

tbl
        dt      0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76
        dt      0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0
        dt      0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15
        dt      0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75
        dt      0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84
        dt      0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf
        dt      0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8
        dt      0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2
        dt      0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73
        dt      0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb
        dt      0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79
        dt      0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08
        dt      0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a
        dt      0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e
        dt      0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf
        dt      0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16
 
i have 16 bytes for input
the first byte to manipulate is 0x19 and must output 0xd4

i simulated the code and i will show you the results

Code:
call subBytes
movwf portd

subBytes 
		movf 	s0,w                                 ;s0 holds the value 0x19,  W=0x19
		movlw High rdsbox                            ;Wreg now becomes 0x01   
		addwf Offset_H,w                             ; nothing changes in the special fuction  
                                                                   registers  (only TMRO and PCL)
		movwf PCLATH                                 ; PCLATH becomes 0x01
		movlw Low rdsbox                             ; Wreg=0xE2    why? 
		addwf Offset_L,w                             ; no change same as above
		btfsc status,carry_bit                       ; after this instruction debugger skips the next
		incf PCLATH,f                                ;
		movwf PCL                                     ; PCL = 0xE2




rdsbox	
        dt      0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76
        dt      0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0
        dt      0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15
        dt      0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75
        dt      0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84
        dt      0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf
        dt      0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8
        dt      0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2
        dt      0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73
        dt      0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb
        dt      0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79
        dt      0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08
        dt      0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a
        dt      0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e
        dt      0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf
        dt      0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16

after return Wreg= 0x63 and portd= 0x63

any guess where is the mistake??
 
Hi Krpz I'm aware of "aes encryption" & never used.I showed a method of what Mike has done in a different mannar.

I still didn't get what you require, this is bcuz I never used that encryption before.

I may able to help in code if you simply say what you are going to do.

I'm confused with this line.

"The first byte to manipulate is 0x19 and must output 0xd4"

0x19=25 & 0XD4=212

Whats the relationship between those?
 
i will explain you:

lets say i made some calculations with my code and i get to a point that i have 16 variables(s0-s15) with this values:
s0=0x19
s1=0x3d
s2=0xe3
.
.
.
s15=0x08

in this part of the encryption i need to use a lookup table to assign new values to this variables (s0-s15) with a formula.
what is this formula?? lets take s0=0x19 ---> this means from the lookup table find the value that located in the 1st row and 9th collumn (from previous s0 value (0x19)) and replace the old value with the new

so according to the lookup table :
Code:
   | 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
---|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
0  |63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76 
1  |ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0 
2  |b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15 
3  |04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75 
4  |09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84 
5  |53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf 
6  |d0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8 
7  |51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2 
8  |cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73 
9  |60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db 
a  |e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79 
b  |e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08 
c0 |ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a 
d0 |70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e 
e0 |e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df 
f0 |8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16


this value is 0xD4. this is what my code want to do. After this procedure finish s0-s15 will have the new values:
s0=0xd4
s1=0x27
s2=0x11
......

if you dont understand something just tell me,
and thanks for your effort to help me
 
You say you have 16 bytes for inputs.In my code Offset_H & Offset_L are the inputs.

If your s0=0x19 Offset_H=0 & Offset_L=0x19.

you are right , i am going to change my code and see what i have :)

It is not Offset_H=1 and Offset_L=0x09?????
 
Last edited:
you are right , i am going to change my code and see what i have :)

It is not Offset_H=1 and Offset_L=0x09?????

No.See the changes

Code:
subBytes 	movf	s0,W
		movwf	Offset_L
		clrf	Offset_H
		movlw 	High rdsbox
		addwf 	Offset_H,w
		movwf 	PCLATH
		movlw 	Low rdsbox
		addwf 	Offset_L,w
		btfsc 	status,carry_bit
		incf 	PCLATH,f
		movwf 	PCL

rdsbox	
        dt      0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76
        dt      0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0
        dt      0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15
        dt      0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75
        dt      0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84
        dt      0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf
        dt      0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8
        dt      0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2
        dt      0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73
        dt      0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb
        dt      0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79
        dt      0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08
        dt      0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a
        dt      0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e
        dt      0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf
        dt      0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16
 
it works perfectly :) thank you! much appreciated

by:
Code:
movlw 	High rdsbox

we mean: from the literal value of Wreg take the high bit but rdsbox is doing what in this instrucrtion?




P.S:sorry about my questions, i have already learn a lot of things with your help
 
Hi krpz,

I apologize for using the "/256" and "%256" operators in my example. These can only be used if you've declared radix dec ahead of time. I'm so sorry! As Gayan suggested, using the "high" and "low" operators would have been a better choice.

Good luck on your project.

Cheerful regards, Mike
 
Its the higher byte of the memory address in the lookup table.
If you write your table in the 1st 0xFF location then High rdsbox will contain 0x00.
If you write your table in the 2nd 0xFF location then High rdsbox will contain 1x00.You are moving 0X1 to PCLATH.


It must load to PCLATH register prior to writing to PCL.In your case you are dealing with below 256 values.If you have more than 256 data in your table & if you place your table above 2K limit mark of your program memory for sure you will need to write to PCLATH.
 
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top