Code samples for MIX and XIM
Using MIX as a hash function
; Compute hash of 4-word object unsigned hash word.1 word.2 word.3 word.4 hash = o3THvL`t mix word.1 ; use 36-bit const as initial value hash = hash mix word.2 ; use progressive words of object hash = hash mix word.3 hash = hash mix word.4
Using MIX as a pseudorandom number generator
I apologize that this uses the LFSR macro, which remains unimplemented as of 27 June 2023. The dissertation (which says LFSR is an instruction, but it’s actually a one-instruction macro) describes LFSR on pages 162 and 389. The main holdups are (i) ironing out names and semantics for the STUN instructions (which would give us a dependable STUN-based workaround), and (ii) choosing assembler macro semantics and implementing macro support (which would let us use LFSR as shown here).
; Pseudorandom number generator
get_next_rand:: ; period of PRNG >= (2**36) - 1
unsigned state1 state2 output
keep state1 state2 output
state2 = lfsr state2 ; rekey in just one instruction
state1 = state1 mix state2 ; new value
output = state1 ; keep caller from changing state
return
main_program::
get_next_rand::state1 = zRN6x1`t ; 36-bit seed #1
get_next_rand::state2 = mPC$TB`t ; 36-bit seed #2
loop:
call get_next_rand
; do something with that
jump loop
Using MIX as a block cipher round function
; Toy example cipher - insecure!
encrypt::
unsigned in out key.1 key.2
keep in out key.1 key.2
out = in mix key.1 ; ECB mode with 36-bit block size
out = out mix key.2 ; two rounds total
return
decrypt::
unsigned in out key.1 key.2
keep in out key.1 key.2
out = in xim key.2 ; "in" here is "out" from encrypt
out = out xim key.1 ; "unwrap" key in reverse order
return
main_program::
encrypt::key.1 = EtdvIv`t ; bits 0-35 of key
encrypt::key.2 = yKoM2j`t ; bits 36-71 of key
encrypt::in = (a word to encrypt)
call encrypt
decrypt::key.1 = EtdvIv`t ; same key as for encryption
decrypt::key.2 = yKoM2j`t
decrypt::in = encrypt::out
call decrypt
; decrypt.out will be the same word as encrypt.in