* Copyright (c) 2017 Stephen Heumann * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * AES encryption and decryption functions for the 65816 * * The general approach is largely based on the public domain * 'aestable.c' implementation by Karl Malbrain, available at: * https://code.google.com/archive/p/byte-oriented-aes/downloads * Portions are also based on the public domain 'rijndael-alg-fst.c' * reference implementation by Vincent Rijmen, Antoon Bosselaers, * and Paulo Barreto. case on mcopy aes.macros * Dummy segment to go in .ROOT file align 256 dummy private end * Data tables used for AES encryption and decryption. * For best performance, these should be page-aligned. align 256 tables privdata Sbox anop ; forward s-box dc h'63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76' dc h'ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0' dc h'b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15' dc h'04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75' dc h'09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84' dc h'53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf' dc h'd0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8' dc h'51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2' dc h'cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73' dc h'60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db' dc h'e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79' dc h'e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08' dc h'ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a' dc h'70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e' dc h'e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df' dc h'8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16' InvSbox anop ; inverse s-box dc h'52 09 6a d5 30 36 a5 38 bf 40 a3 9e 81 f3 d7 fb' dc h'7c e3 39 82 9b 2f ff 87 34 8e 43 44 c4 de e9 cb' dc h'54 7b 94 32 a6 c2 23 3d ee 4c 95 0b 42 fa c3 4e' dc h'08 2e a1 66 28 d9 24 b2 76 5b a2 49 6d 8b d1 25' dc h'72 f8 f6 64 86 68 98 16 d4 a4 5c cc 5d 65 b6 92' dc h'6c 70 48 50 fd ed b9 da 5e 15 46 57 a7 8d 9d 84' dc h'90 d8 ab 00 8c bc d3 0a f7 e4 58 05 b8 b3 45 06' dc h'd0 2c 1e 8f ca 3f 0f 02 c1 af bd 03 01 13 8a 6b' dc h'3a 91 11 41 4f 67 dc ea 97 f2 cf ce f0 b4 e6 73' dc h'96 ac 74 22 e7 ad 35 85 e2 f9 37 e8 1c 75 df 6e' dc h'47 f1 1a 71 1d 29 c5 89 6f b7 62 0e aa 18 be 1b' dc h'fc 56 3e 4b c6 d2 79 20 9a db c0 fe 78 cd 5a f4' dc h'1f dd a8 33 88 07 c7 31 b1 12 10 59 27 80 ec 5f' dc h'60 51 7f a9 19 b5 4a 0d 2d e5 7a 9f 93 c9 9c ef' dc h'a0 e0 3b 4d ae 2a f5 b0 c8 eb bb 3c 83 53 99 61' dc h'17 2b 04 7e ba 77 d6 26 e1 69 14 63 55 21 0c 7d' Xtime2Sbox anop ; combined Xtimes2[Sbox[]] dc h'c6 f8 ee f6 ff d6 de 91 60 02 ce 56 e7 b5 4d ec' dc h'8f 1f 89 fa ef b2 8e fb 41 b3 5f 45 23 53 e4 9b' dc h'75 e1 3d 4c 6c 7e f5 83 68 51 d1 f9 e2 ab 62 2a' dc h'08 95 46 9d 30 37 0a 2f 0e 24 1b df cd 4e 7f ea' dc h'12 1d 58 34 36 dc b4 5b a4 76 b7 7d 52 dd 5e 13' dc h'a6 b9 00 c1 40 e3 79 b6 d4 8d 67 72 94 98 b0 85' dc h'bb c5 4f ed 86 9a 66 11 8a e9 04 fe a0 78 25 4b' dc h'a2 5d 80 05 3f 21 70 f1 63 77 af 42 20 e5 fd bf' dc h'81 18 26 c3 be 35 88 2e 93 55 fc 7a c8 ba 32 e6' dc h'c0 19 9e a3 44 54 3b 0b 8c c7 6b 28 a7 bc 16 ad' dc h'db 64 74 14 92 0c 48 b8 9f bd 43 c4 39 31 d3 f2' dc h'd5 8b 6e da 01 b1 9c 49 d8 ac f3 cf ca f4 47 10' dc h'6f f0 4a 5c 38 57 73 97 cb a1 e8 3e 96 61 0d 0f' dc h'e0 7c 71 cc 90 06 f7 1c c2 6a ae 69 17 99 3a 27' dc h'd9 eb 2b 22 d2 a9 07 33 2d 3c 15 c9 87 aa 50 a5' dc h'03 59 09 1a 65 d7 84 d0 82 29 5a 1e 7b a8 6d 2c' Xtime3Sbox anop ; combined Xtimes3[Sbox[]] dc h'a5 84 99 8d 0d bd b1 54 50 03 a9 7d 19 62 e6 9a' dc h'45 9d 40 87 15 eb c9 0b ec 67 fd ea bf f7 96 5b' dc h'c2 1c ae 6a 5a 41 02 4f 5c f4 34 08 93 73 53 3f' dc h'0c 52 65 5e 28 a1 0f b5 09 36 9b 3d 26 69 cd 9f' dc h'1b 9e 74 2e 2d b2 ee fb f6 4d 61 ce 7b 3e 71 97' dc h'f5 68 00 2c 60 1f c8 ed be 46 d9 4b de d4 e8 4a' dc h'6b 2a e5 16 c5 d7 55 94 cf 10 06 81 f0 44 ba e3' dc h'f3 fe c0 8a ad bc 48 04 df c1 75 63 30 1a 0e 6d' dc h'4c 14 35 2f e1 a2 cc 39 57 f2 82 47 ac e7 2b 95' dc h'a0 98 d1 7f 66 7e ab 83 ca 29 d3 3c 79 e2 1d 76' dc h'3b 56 4e 1e db 0a 6c e4 5d 6e ef a6 a8 a4 37 8b' dc h'32 43 59 b7 8c 64 d2 e0 b4 fa 07 25 af 8e e9 18' dc h'd5 88 6f 72 24 f1 c7 51 23 7c 9c 21 dd dc 86 85' dc h'90 42 c4 aa d8 05 01 12 a3 5f f9 d0 91 58 27 b9' dc h'38 13 b3 33 bb 70 89 a7 b6 22 92 20 49 ff 78 7a' dc h'8f f8 80 17 da 31 c6 b8 c3 b0 77 11 cb fc d6 3a' ;Xtime2 anop ; dc h'00 02 04 06 08 0a 0c 0e 10 12 14 16 18 1a 1c 1e' ; dc h'20 22 24 26 28 2a 2c 2e 30 32 34 36 38 3a 3c 3e' ; dc h'40 42 44 46 48 4a 4c 4e 50 52 54 56 58 5a 5c 5e' ; dc h'60 62 64 66 68 6a 6c 6e 70 72 74 76 78 7a 7c 7e' ; dc h'80 82 84 86 88 8a 8c 8e 90 92 94 96 98 9a 9c 9e' ; dc h'a0 a2 a4 a6 a8 aa ac ae b0 b2 b4 b6 b8 ba bc be' ; dc h'c0 c2 c4 c6 c8 ca cc ce d0 d2 d4 d6 d8 da dc de' ; dc h'e0 e2 e4 e6 e8 ea ec ee f0 f2 f4 f6 f8 fa fc fe' ; dc h'1b 19 1f 1d 13 11 17 15 0b 09 0f 0d 03 01 07 05' ; dc h'3b 39 3f 3d 33 31 37 35 2b 29 2f 2d 23 21 27 25' ; dc h'5b 59 5f 5d 53 51 57 55 4b 49 4f 4d 43 41 47 45' ; dc h'7b 79 7f 7d 73 71 77 75 6b 69 6f 6d 63 61 67 65' ; dc h'9b 99 9f 9d 93 91 97 95 8b 89 8f 8d 83 81 87 85' ; dc h'bb b9 bf bd b3 b1 b7 b5 ab a9 af ad a3 a1 a7 a5' ; dc h'db d9 df dd d3 d1 d7 d5 cb c9 cf cd c3 c1 c7 c5' ; dc h'fb f9 ff fd f3 f1 f7 f5 eb e9 ef ed e3 e1 e7 e5' Xtime9 anop dc h'00 09 12 1b 24 2d 36 3f 48 41 5a 53 6c 65 7e 77' dc h'90 99 82 8b b4 bd a6 af d8 d1 ca c3 fc f5 ee e7' dc h'3b 32 29 20 1f 16 0d 04 73 7a 61 68 57 5e 45 4c' dc h'ab a2 b9 b0 8f 86 9d 94 e3 ea f1 f8 c7 ce d5 dc' dc h'76 7f 64 6d 52 5b 40 49 3e 37 2c 25 1a 13 08 01' dc h'e6 ef f4 fd c2 cb d0 d9 ae a7 bc b5 8a 83 98 91' dc h'4d 44 5f 56 69 60 7b 72 05 0c 17 1e 21 28 33 3a' dc h'dd d4 cf c6 f9 f0 eb e2 95 9c 87 8e b1 b8 a3 aa' dc h'ec e5 fe f7 c8 c1 da d3 a4 ad b6 bf 80 89 92 9b' dc h'7c 75 6e 67 58 51 4a 43 34 3d 26 2f 10 19 02 0b' dc h'd7 de c5 cc f3 fa e1 e8 9f 96 8d 84 bb b2 a9 a0' dc h'47 4e 55 5c 63 6a 71 78 0f 06 1d 14 2b 22 39 30' dc h'9a 93 88 81 be b7 ac a5 d2 db c0 c9 f6 ff e4 ed' dc h'0a 03 18 11 2e 27 3c 35 42 4b 50 59 66 6f 74 7d' dc h'a1 a8 b3 ba 85 8c 97 9e e9 e0 fb f2 cd c4 df d6' dc h'31 38 23 2a 15 1c 07 0e 79 70 6b 62 5d 54 4f 46' XtimeB anop dc h'00 0b 16 1d 2c 27 3a 31 58 53 4e 45 74 7f 62 69' dc h'b0 bb a6 ad 9c 97 8a 81 e8 e3 fe f5 c4 cf d2 d9' dc h'7b 70 6d 66 57 5c 41 4a 23 28 35 3e 0f 04 19 12' dc h'cb c0 dd d6 e7 ec f1 fa 93 98 85 8e bf b4 a9 a2' dc h'f6 fd e0 eb da d1 cc c7 ae a5 b8 b3 82 89 94 9f' dc h'46 4d 50 5b 6a 61 7c 77 1e 15 08 03 32 39 24 2f' dc h'8d 86 9b 90 a1 aa b7 bc d5 de c3 c8 f9 f2 ef e4' dc h'3d 36 2b 20 11 1a 07 0c 65 6e 73 78 49 42 5f 54' dc h'f7 fc e1 ea db d0 cd c6 af a4 b9 b2 83 88 95 9e' dc h'47 4c 51 5a 6b 60 7d 76 1f 14 09 02 33 38 25 2e' dc h'8c 87 9a 91 a0 ab b6 bd d4 df c2 c9 f8 f3 ee e5' dc h'3c 37 2a 21 10 1b 06 0d 64 6f 72 79 48 43 5e 55' dc h'01 0a 17 1c 2d 26 3b 30 59 52 4f 44 75 7e 63 68' dc h'b1 ba a7 ac 9d 96 8b 80 e9 e2 ff f4 c5 ce d3 d8' dc h'7a 71 6c 67 56 5d 40 4b 22 29 34 3f 0e 05 18 13' dc h'ca c1 dc d7 e6 ed f0 fb 92 99 84 8f be b5 a8 a3' XtimeD anop dc h'00 0d 1a 17 34 39 2e 23 68 65 72 7f 5c 51 46 4b' dc h'd0 dd ca c7 e4 e9 fe f3 b8 b5 a2 af 8c 81 96 9b' dc h'bb b6 a1 ac 8f 82 95 98 d3 de c9 c4 e7 ea fd f0' dc h'6b 66 71 7c 5f 52 45 48 03 0e 19 14 37 3a 2d 20' dc h'6d 60 77 7a 59 54 43 4e 05 08 1f 12 31 3c 2b 26' dc h'bd b0 a7 aa 89 84 93 9e d5 d8 cf c2 e1 ec fb f6' dc h'd6 db cc c1 e2 ef f8 f5 be b3 a4 a9 8a 87 90 9d' dc h'06 0b 1c 11 32 3f 28 25 6e 63 74 79 5a 57 40 4d' dc h'da d7 c0 cd ee e3 f4 f9 b2 bf a8 a5 86 8b 9c 91' dc h'0a 07 10 1d 3e 33 24 29 62 6f 78 75 56 5b 4c 41' dc h'61 6c 7b 76 55 58 4f 42 09 04 13 1e 3d 30 27 2a' dc h'b1 bc ab a6 85 88 9f 92 d9 d4 c3 ce ed e0 f7 fa' dc h'b7 ba ad a0 83 8e 99 94 df d2 c5 c8 eb e6 f1 fc' dc h'67 6a 7d 70 53 5e 49 44 0f 02 15 18 3b 36 21 2c' dc h'0c 01 16 1b 38 35 22 2f 64 69 7e 73 50 5d 4a 47' dc h'dc d1 c6 cb e8 e5 f2 ff b4 b9 ae a3 80 8d 9a 97' XtimeE anop dc h'00 0e 1c 12 38 36 24 2a 70 7e 6c 62 48 46 54 5a' dc h'e0 ee fc f2 d8 d6 c4 ca 90 9e 8c 82 a8 a6 b4 ba' dc h'db d5 c7 c9 e3 ed ff f1 ab a5 b7 b9 93 9d 8f 81' dc h'3b 35 27 29 03 0d 1f 11 4b 45 57 59 73 7d 6f 61' dc h'ad a3 b1 bf 95 9b 89 87 dd d3 c1 cf e5 eb f9 f7' dc h'4d 43 51 5f 75 7b 69 67 3d 33 21 2f 05 0b 19 17' dc h'76 78 6a 64 4e 40 52 5c 06 08 1a 14 3e 30 22 2c' dc h'96 98 8a 84 ae a0 b2 bc e6 e8 fa f4 de d0 c2 cc' dc h'41 4f 5d 53 79 77 65 6b 31 3f 2d 23 09 07 15 1b' dc h'a1 af bd b3 99 97 85 8b d1 df cd c3 e9 e7 f5 fb' dc h'9a 94 86 88 a2 ac be b0 ea e4 f6 f8 d2 dc ce c0' dc h'7a 74 66 68 42 4c 5e 50 0a 04 16 18 32 3c 2e 20' dc h'ec e2 f0 fe d4 da c8 c6 9c 92 80 8e a4 aa b8 b6' dc h'0c 02 10 1e 34 3a 28 26 7c 72 60 6e 44 4a 58 56' dc h'37 39 2b 25 0f 01 13 1d 47 49 5b 55 7f 71 63 6d' dc h'd7 d9 cb c5 ef e1 f3 fd a7 a9 bb b5 9f 91 83 8d' Rcon anop dc h'01 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00' dc h'02 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00' dc h'04 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00' dc h'08 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00' dc h'10 00 04 00 00 00 00 00 00 08 00 00 00 00 00 00' dc h'20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' dc h'40 10 08 00 00 00 00 00 00 00 00 00 00 00 00 00' dc h'80 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00' dc h'1b 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00' dc h'36 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00' dc h'6c 00 20 00 00 00 00 00 00 80 00 00 00 00 00 00' dc h'd8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' dc h'ab 1b 40' end * Direct page locations state1 gequ 0 state2 gequ 16 keysize gequ 32 rk gequ 33 * Constants used for keysize keysize_128 gequ 0 keysize_192 gequ 64 keysize_256 gequ 128 * AES key expansion functions * The appropriate one of these must be called before encrypting or decrypting. * The key should be in the first 16/24/32 bytes of rk before calling this. * Callable from C, with context structure pointer on stack. aes128_expandkey start CFunction AES128_EXPANDKEY end aes192_expandkey start CFunction AES192_EXPANDKEY end aes256_expandkey start CFunction AES256_EXPANDKEY end * Call with DP = AES context structure (with key present but not expanded), * DB = bank containing AES tables. AES128_EXPANDKEY start using tables stz keysize-1 ;keysize_128 ldx #16 clc top anop ExpandKeyCore 16,0 ExpandKeyIter 16,3 txa adc #16 tax cmp #16*11 blt top rtl end AES192_EXPANDKEY start using tables lda #keysize_192|8 sta keysize-1 ldx #24 clc top anop ExpandKeyCore 24,1 ExpandKeyIter 24,5 txa adc #24 tax cmp #16*13 blt top rtl end AES256_EXPANDKEY start using tables lda #keysize_256|8 sta keysize-1 ldx #32 clc top anop ExpandKeyCore 32,2 ExpandKeyIter 32,3 txa adc #16 tax cmp #16*15 bge done ExpandKeySubst 32,2 ExpandKeyIter 32,3 txa adc #16 tax brl top done rtl end * AES encryption function * This performs AES-128, AES-192, or AES-256 encryption, depending on the key. * The unencrypted input and encrypted output are in state1. * Callable from C, with context structure pointer on stack. aes_encrypt start CFunction AES_ENCRYPT end * Call with DP = AES context structure (with key expanded), * DB = bank containing AES tables. AES_ENCRYPT start using tables AddInitialRoundKey ShortRegs NormalRound 1 NormalRound 2 NormalRound 3 NormalRound 4 NormalRound 5 NormalRound 6 NormalRound 7 NormalRound 8 NormalRound 9 lda keysize bne cont1 jmp finish_aes128 cont1 NormalRound 10 NormalRound 11 lda keysize bmi cont2 jmp finish_aes192 cont2 NormalRound 12 NormalRound 13 finish_aes256 anop FinalRound 14 LongRegs rtl finish_aes192 anop FinalRound 12 LongRegs rtl finish_aes128 anop FinalRound 10 LongRegs rtl end * AES decryption functions * The encrypted input and unencrypted output are in state1. * Callable from C, with context structure pointer on stack. aes_decrypt start CFunction AES_DECRYPT end aes128_decrypt start CFunction AES128_DECRYPT end aes192_decrypt start CFunction AES192_DECRYPT end aes256_decrypt start CFunction AES256_DECRYPT end * Call with DP = AES context structure (with key expanded), * DB = bank containing AES tables. AES_DECRYPT start using tables ShortRegs lda keysize bne not128 jmp aes128_decrypt_internal not128 bmi aes256_decrypt_internal jmp aes192_decrypt_internal AES256_DECRYPT entry ShortRegs aes256_decrypt_internal anop InvFinalRound 14 InvNormalRound 13 InvNormalRound 12 jmp cont1 AES192_DECRYPT entry ShortRegs aes192_decrypt_internal anop InvFinalRound 12 cont1 anop InvNormalRound 11 InvNormalRound 10 jmp cont2 AES128_DECRYPT entry ShortRegs aes128_decrypt_internal anop InvFinalRound 10 cont2 anop InvNormalRound 9 InvNormalRound 8 InvNormalRound 7 InvNormalRound 6 InvNormalRound 5 InvNormalRound 4 InvNormalRound 3 InvNormalRound 2 InvNormalRound 1 LongRegs rtl end