aes.om (4144B)
1 // https://doi.org/10.6028/NIST.FIPS.197-upd1 2 3 func aes_expand(w: *byte, key: *byte) { 4 var i: int; 5 var j: int; 6 var aes_sb: *byte; 7 var aes_rc: *byte; 8 9 aes_sb = "c|w{\xf2ko\xc50\x01g+\xfe\xd7\xabv\xca\x82\xc9}\xfaYG\xf0\xad\xd4\xa2\xaf\x9c\xa4r\xc0\xb7\xfd\x93&6?\xf7\xcc4\xa5\xe5\xf1q\xd81\x15\x04\xc7#\xc3\x18\x96\x05\x9a\x07\x12\x80\xe2\xeb'\xb2u\t\x83,\x1a\x1bnZ\xa0R;\xd6\xb3)\xe3/\x84S\xd1\x00\xed \xfc\xb1[j\xcb\xbe9JLX\xcf\xd0\xef\xaa\xfbCM3\x85E\xf9\x02\x7fP<\x9f\xa8Q\xa3@\x8f\x92\x9d8\xf5\xbc\xb6\xda!\x10\xff\xf3\xd2\xcd\x0c\x13\xec_\x97D\x17\xc4\xa7~=d]\x19s`\x81O\xdc\"*\x90\x88F\xee\xb8\x14\xde^\x0b\xdb\xe02:\nI\x06$\\\xc2\xd3\xacb\x91\x95\xe4y\xe7\xc87m\x8d\xd5N\xa9lV\xf4\xeaez\xae\x08\xbax%.\x1c\xa6\xb4\xc6\xe8\xddt\x1fK\xbd\x8b\x8ap>\xb5fH\x03\xf6\x0ea5W\xb9\x86\xc1\x1d\x9e\xe1\xf8\x98\x11i\xd9\x8e\x94\x9b\x1e\x87\xe9\xceU(\xdf\x8c\xa1\x89\r\xbf\xe6BhA\x99-\x0f\xb0T\xbb\x16"; 10 aes_rc = "\x01\x02\x04\x08\x10 @\x80\x1b6"; 11 12 i = 0; 13 loop { 14 if i == 16 { 15 break; 16 } 17 18 w[i] = key[i]; 19 20 i = i + 1; 21 } 22 23 j = 0; 24 loop { 25 if j == 10 { 26 break; 27 } 28 29 w[i] = w[i - 16] ^ aes_sb[w[i - 3]] ^ aes_rc[j]; i = i + 1; 30 w[i] = w[i - 16] ^ aes_sb[w[i - 3]]; i = i + 1; 31 w[i] = w[i - 16] ^ aes_sb[w[i - 3]]; i = i + 1; 32 w[i] = w[i - 16] ^ aes_sb[w[i - 7]]; i = i + 1; 33 34 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 35 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 36 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 37 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 38 39 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 40 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 41 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 42 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 43 44 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 45 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 46 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 47 w[i] = w[i - 16] ^ w[i - 4]; i = i + 1; 48 49 j = j + 1; 50 } 51 } 52 53 func aes_two(x: byte): byte { 54 var a: int; 55 a = x as int; 56 a = (a << 1) ^ ((a >> 7) * 0x1b); 57 return a as byte; 58 } 59 60 struct _aes { 61 a: int; 62 b: int; 63 } 64 65 func aes_cipher(cipher: *byte, plain: *byte, w: *byte) { 66 var tmp: _aes; 67 var s: *byte; 68 var t: byte; 69 var abcd: byte; 70 var i: int; 71 var j: int; 72 var aes_sb: *byte; 73 74 s = (&tmp) as *byte; 75 76 aes_sb = "c|w{\xf2ko\xc50\x01g+\xfe\xd7\xabv\xca\x82\xc9}\xfaYG\xf0\xad\xd4\xa2\xaf\x9c\xa4r\xc0\xb7\xfd\x93&6?\xf7\xcc4\xa5\xe5\xf1q\xd81\x15\x04\xc7#\xc3\x18\x96\x05\x9a\x07\x12\x80\xe2\xeb'\xb2u\t\x83,\x1a\x1bnZ\xa0R;\xd6\xb3)\xe3/\x84S\xd1\x00\xed \xfc\xb1[j\xcb\xbe9JLX\xcf\xd0\xef\xaa\xfbCM3\x85E\xf9\x02\x7fP<\x9f\xa8Q\xa3@\x8f\x92\x9d8\xf5\xbc\xb6\xda!\x10\xff\xf3\xd2\xcd\x0c\x13\xec_\x97D\x17\xc4\xa7~=d]\x19s`\x81O\xdc\"*\x90\x88F\xee\xb8\x14\xde^\x0b\xdb\xe02:\nI\x06$\\\xc2\xd3\xacb\x91\x95\xe4y\xe7\xc87m\x8d\xd5N\xa9lV\xf4\xeaez\xae\x08\xbax%.\x1c\xa6\xb4\xc6\xe8\xddt\x1fK\xbd\x8b\x8ap>\xb5fH\x03\xf6\x0ea5W\xb9\x86\xc1\x1d\x9e\xe1\xf8\x98\x11i\xd9\x8e\x94\x9b\x1e\x87\xe9\xceU(\xdf\x8c\xa1\x89\r\xbf\xe6BhA\x99-\x0f\xb0T\xbb\x16"; 77 78 i = 0; 79 loop { 80 if i == 16 { 81 break; 82 } 83 84 s[i] = plain[i] ^ w[i]; 85 86 i = i + 1; 87 } 88 89 j = 1; 90 loop { 91 if j == 10 { 92 break; 93 } 94 95 i = 0; 96 loop { 97 if i == 16 { 98 break; 99 } 100 101 s[i] = aes_sb[s[i]]; 102 103 i = i + 1; 104 } 105 106 t=s[1]; s[1]=s[5]; s[5]=s[9]; s[9]=s[13];s[13]=t; 107 t=s[2]; s[2]=s[10]; s[10]=t; t=s[6];s[6]=s[14];s[14]=t; 108 t=s[15];s[15]=s[11];s[11]=s[7]; s[7]=s[3]; s[3]=t; 109 110 i = 0; 111 loop { 112 if i == 16 { 113 break; 114 } 115 116 t = s[i]; abcd = s[i] ^ s[i + 1] ^ s[i + 2] ^ s[i + 3]; 117 s[i] = s[i] ^ abcd ^ aes_two(s[i] ^ s[i + 1]); 118 s[i + 1] = s[i + 1] ^ abcd ^ aes_two(s[i + 1] ^ s[i + 2]); 119 s[i + 2] = s[i + 2] ^ abcd ^ aes_two(s[i + 2] ^ s[i + 3]); 120 s[i + 3] = s[i + 3] ^ abcd ^ aes_two(s[i + 3] ^ t); 121 122 i = i + 4; 123 } 124 125 i = 0; 126 loop { 127 if i == 16 { 128 break; 129 } 130 131 s[i] = s[i] ^ w[j * 16 + i]; 132 133 i = i + 1; 134 } 135 136 j = j + 1; 137 } 138 139 loop { 140 if i == 16 { 141 break; 142 } 143 144 s[i] = aes_sb[s[i]]; 145 146 i = i + 1; 147 } 148 149 t=s[1]; s[1]=s[5]; s[5]=s[9]; s[9]=s[13];s[13]=t; 150 t=s[2]; s[2]=s[10]; s[10]=t; t=s[6];s[6]=s[14];s[14]=t; 151 t=s[15];s[15]=s[11];s[11]=s[7]; s[7]=s[3]; s[3]=t; 152 153 loop { 154 if i == 16 { 155 break; 156 } 157 158 cipher[i] = s[i] ^ w[i + 10 * 16]; 159 160 i = i + 1; 161 } 162 }