os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

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 }