It is difficult, perhaps impossible, to learn where the generator state resides in the too concise synopsis of RC4 function given here.
We expand here.
In each case the mutable state resides in s.
- (define r (fileVal "RC4"))
r is an immutable value that accesses the functionality as follows:
- (define s (r seed))
s abstracts (hides) a new mutable RC4 generator state initialized by seed which is an ASCII string, in the sense of a Scheme string.
s is a function that takes a scheme symbol as an argument.
s returns a generator, sequential invocations of which mutate the generator s to produce and return a random value.
- (define bs (s 'nb))
(bs n) yields the next pseudo random integer with 8n bits and s is thereby mutated.
- (define byteg (s 'sb))
then (byteg) yields the next 8 bit integer and mutates s.
- (define rn ((s 'rbi) n))
Successive invocations of rn produce a new random number 0≤x<n and mutate s.
The RC4 crypto plan is to produce the key-stream for seed s as follows:
(define t ((fileVal "RC4") 'sb s)).
The jth invocation of this value produces the jth character from the stream.
(list (t) (t) (t) … ) is then the key-stream.
Some advocate discarding the first 1000 stream values.
Here are my development notes for the code.