Skip to content

Commit c9c5f3d

Browse files
committed
make aesni and ars operate on public types
1 parent e90a917 commit c9c5f3d

File tree

3 files changed

+61
-17
lines changed

3 files changed

+61
-17
lines changed

src/aesni.jl

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -201,16 +201,14 @@ copy(src::AESNI4x) = copyto!(AESNI4x(), src)
201201
==(r1::AESNI4x, r2::AESNI4x) = unsafe_compare(r1, r2, UInt128, 2) &&
202202
r1.key == r2.key && r1.p == r2.p
203203

204-
function get_key(o::Union{AESNI1x, AESNI4x})::NTuple{11, __m128i}
204+
function get_key__m128i(o::Union{AESNI1x, AESNI4x})::NTuple{11, __m128i}
205205
k = o.key
206206
(k.key1,k.key2,k.key3,k.key4,k.key5,k.key6,k.key7,k.key8,k.key9,k.key10,k.key11)
207207
end
208-
function get_ctr(o::AESNI4x)::Tuple{__m128i}
209-
(o.ctr1,)
210-
end
211-
function get_ctr(o::AESNI1x)::Tuple{__m128i}
212-
(o.ctr,)
213-
end
208+
get_ctr__m128i(o::AESNI4x)::Tuple{__m128i} = (o.ctr1,)
209+
get_ctr__m128i(o::AESNI1x)::Tuple{__m128i} = (o.ctr,)
210+
get_key(o::Union{AESNI1x, AESNI4x})::NTuple{11,UInt128} = map(UInt128, get_key__m128i(o))
211+
get_ctr(o::Union{AESNI1x, AESNI4x})::Tuple{UInt128} = map(UInt128, get_ctr__m128i(o))
214212

215213
@inline function aesni(key::NTuple{11,__m128i}, ctr::Tuple{__m128i})::Tuple{__m128i}
216214
key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11 = key
@@ -229,12 +227,25 @@ end
229227
(x,)
230228
end
231229

230+
"""
231+
aesni(key::NTuple{11,UInt128}, ctr::Tuple{UInt128})::Tuple{UInt128}
232+
233+
Functional variant of [`AESNI1x`](@ref) and [`AESNI4x`](@ref).
234+
This function if free of mutability and side effects.
235+
"""
236+
@inline function aesni(key::NTuple{11,UInt128}, ctr::Tuple{UInt128})::Tuple{UInt128}
237+
k = map(__m128i, key)
238+
c = map(__m128i, ctr)
239+
map(UInt128,aesni(k,c))
240+
end
241+
242+
232243
@inline function random123_r(r::AESNI1x)
233-
r.x = only(aesni(get_key(r), get_ctr(r)))
244+
r.x = only(aesni(get_key__m128i(r), get_ctr__m128i(r)))
234245
(UInt128(r.x),)
235246
end
236247

237248
@inline function random123_r(r::AESNI4x)
238-
r.x = only(aesni(get_key(r), get_ctr(r)))
249+
r.x = only(aesni(get_key__m128i(r), get_ctr__m128i(r)))
239250
split_uint(UInt128(r.x), UInt32)
240251
end

src/ars.jl

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ copy(src::ARS4x{R}) where R = ARS4x{R}(src.x, src.ctr1, src.key, src.p)
9898

9999
==(r1::ARS4x{R}, r2::ARS4x{R}) where R = unsafe_compare(r1, r2, UInt128, 3) && r1.p r2.p
100100

101-
function expr_ars1xm128i(expr_key::Expr, expr_ctr::Expr, R)
101+
function expr_ars1xm128i(expr_key, expr_ctr, R)
102102
@assert R isa Int && 1 R 10
103103
rounds = [quote
104104
kk += kweyl
@@ -130,14 +130,25 @@ end
130130
expr_ars1xm128i(expr_key, expr_ctr, R)
131131
end
132132

133-
@generated function ars(key, ctr, ::Val{R}) where {R}
134-
expr_key = :(only(key))
135-
expr_ctr = :(only(ctr))
136-
expr_ars1xm128i(expr_key, expr_ctr, R)
133+
@generated function ars(key::Tuple{__m128i}, ctr::Tuple{__m128i}, ::Val{R})::Tuple{__m128i} where {R}
134+
:(($(expr_ars1xm128i(:(only(key)), :(only(ctr)), R)),))
137135
end
138-
get_key(r::Union{ARS1x, ARS4x})::Tuple{__m128i} = (r.key,)
139-
get_ctr(r::ARS1x)::Tuple{__m128i} = (r.ctr,)
140-
get_ctr(r::ARS4x)::Tuple{__m128i} = (r.ctr1,)
136+
137+
"""
138+
ars(key::Tuple{UInt128}, ctr::Tuple{UInt128}, rounds::Val{R})::Tuple{UInt128} where {R}
139+
140+
Functional variant of [`ARS1x`](@ref) and [`ARS4x`](@ref).
141+
This function if free of mutability and side effects.
142+
"""
143+
function ars(key::Tuple{UInt128}, ctr::Tuple{UInt128}, rounds::Val{R})::Tuple{UInt128} where {R}
144+
k = map(__m128i, key)
145+
c = map(__m128i, ctr)
146+
map(UInt128,ars(k,c,rounds))
147+
end
148+
149+
get_key(r::Union{ARS1x, ARS4x}) = (UInt128(r.key),)
150+
get_ctr(r::ARS1x) = (UInt128(r.ctr),)
151+
get_ctr(r::ARS4x) = (UInt128(r.ctr1),)
141152

142153
@inline function random123_r(r::ARS1x{R}) where R
143154
r.x = ars1xm128i(r)

test/runtests.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,23 @@ using Printf: @printf
3636
@test isbitstype(typeof(ctr))
3737
@test key isa Tuple
3838
@test ctr isa Tuple
39+
@test eltype(key) <: Union{UInt32, UInt64, UInt128}
40+
@test eltype(ctr) <: Union{UInt32, UInt64, UInt128}
3941
val1 = @inferred alg(key, ctr, options...)
4042
val2 = @inferred alg(key, ctr, options...)
4143
@test val1 === val2
4244
@test val1 isa Tuple
4345
@test isbitstype(typeof(val1))
46+
@test eltype(val1) <: Union{UInt32, UInt64, UInt128}
4447
end
4548
end
4649
@testset "functional consistency" begin
50+
threefry = Random123.threefry
51+
philox = Random123.philox
52+
aesni = Random123.aesni
53+
ars = Random123.ars
54+
get_key = Random123.get_key
55+
get_ctr = Random123.get_ctr
4756
for T in [UInt32, UInt64]
4857
for (rng, alg, option) in [
4958
(Threefry2x(T, (T(123), T(456))), threefry, Val(20)),
@@ -87,6 +96,19 @@ end
8796
@test x8 === y8
8897
@test x9 === y9
8998
end
99+
100+
rng = ARS1x(1)
101+
@test (rand(rng, UInt128),) === ars(get_key(rng), get_ctr(rng), Val(7))
102+
@test (rand(rng, UInt128),) === ars(get_key(rng), get_ctr(rng), Val(7))
103+
@test (rand(rng, UInt128),) === ars(get_key(rng), get_ctr(rng), Val(7))
104+
@test (rand(rng, UInt128),) === ars(get_key(rng), get_ctr(rng), Val(7))
105+
106+
rng = AESNI1x(1)
107+
@test (rand(rng, UInt128),) === aesni(get_key(rng), get_ctr(rng))
108+
@test (rand(rng, UInt128),) === aesni(get_key(rng), get_ctr(rng))
109+
@test (rand(rng, UInt128),) === aesni(get_key(rng), get_ctr(rng))
110+
@test (rand(rng, UInt128),) === aesni(get_key(rng), get_ctr(rng))
111+
90112
end
91113

92114

0 commit comments

Comments
 (0)