mirror of
https://gitea.tendokyu.moe/eamuse/docs.git
synced 2024-11-28 00:20:52 +01:00
Nicer alpha expansion algorithm
This commit is contained in:
parent
697eeeb99e
commit
f0ee40b08c
@ -41,9 +41,10 @@
|
|||||||
key is always 32768 (8000<sub>h</sub>) bytes, and is unmodified during this process.
|
key is always 32768 (8000<sub>h</sub>) bytes, and is unmodified during this process.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Keys are derrived based on a key expansion algorithm that takes as input an unsigned short (16 bit) seed. I'm not
|
Keys are derrived based on a key expansion algorithm that takes as input an unsigned short (16 bit) seed. This
|
||||||
totally sure what expansion algorithm this is, or if it's something totally custom, but for now here's a snippet of
|
algorithm is fundamentally an LSFR-based PRNG, used to generate a stream of bytes, which becomes the key. The
|
||||||
python code that implements the expansion:
|
<code>& 0xffffffff</code> is not strictly necessary but is convenient in python in order to avoid
|
||||||
|
<code>seed</code> blowing up in size.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
@ -51,26 +52,17 @@
|
|||||||
def amAuthDiskInitKey(seed):
|
def amAuthDiskInitKey(seed):
|
||||||
key = bytearray(0x8000)
|
key = bytearray(0x8000)
|
||||||
|
|
||||||
for i in range(0x8000):
|
seed <<= 1
|
||||||
uVar1 = (seed * 2 >> 4 ^ seed * 2) >> 10 & 2 | seed << 2
|
for i in range(len(key)):
|
||||||
|
x = seed
|
||||||
|
|
||||||
uVar2 = uVar1 * 2
|
for _ in range(8):
|
||||||
uVar3 = ((seed << 2) >> 4 ^ uVar1) >> 10 & 2 | uVar2
|
x |= ((((seed >> 4) ^ x) >> 11) & 1)
|
||||||
uVar1 = uVar3 * 2
|
seed <<= 1
|
||||||
uVar3 = (uVar2 >> 4 ^ uVar3) >> 10 & 2 | uVar1
|
x <<= 1
|
||||||
|
key[i] = (x >> 1) & 0xff
|
||||||
|
|
||||||
uVar2 = uVar3 * 2
|
seed = x & 0xffffffff
|
||||||
uVar3 = (uVar1 >> 4 ^ uVar3) >> 10 & 2 | uVar2
|
|
||||||
uVar1 = uVar3 * 2
|
|
||||||
uVar3 = (uVar2 >> 4 ^ uVar3) >> 10 & 2 | uVar1
|
|
||||||
|
|
||||||
uVar2 = uVar3 * 2
|
|
||||||
uVar3 = (uVar1 >> 4 ^ uVar3) >> 10 & 2 | uVar2
|
|
||||||
uVar1 = uVar3 * 2
|
|
||||||
uVar2 = (uVar2 >> 4 ^ uVar3) >> 10 & 2 | uVar1
|
|
||||||
|
|
||||||
seed = uVar2 | (uVar1 >> 4 ^ uVar2) >> 11 & 1
|
|
||||||
key[i] = seed & 0xff
|
|
||||||
|
|
||||||
return key
|
return key
|
||||||
{% endhighlight %}</pre
|
{% endhighlight %}</pre
|
||||||
|
Loading…
Reference in New Issue
Block a user