Packages

Pure Gleam implementation of the SPARX family of lightweight block ciphers (SPARX-64/128, SPARX-128/128, SPARX-128/256)

Current section

Files

Jump to
sparx src sparx.erl
Raw

src/sparx.erl

-module(sparx).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/sparx.gleam").
-export([rotl/2, a/2, a_inv/2, l_2/1, l_2_inv/1, l_4/1, l_4_inv/1]).
-file("src/sparx.gleam", 3).
-spec 'xor'(sparx@uint16:uint16(), sparx@uint16:uint16()) -> sparx@uint16:uint16().
'xor'(A, B) ->
sparx@uint16:bitwise_exclusive_or(A, B).
-file("src/sparx.gleam", 7).
-spec rotl(sparx@uint16:uint16(), integer()) -> sparx@uint16:uint16().
rotl(X, N) ->
sparx@uint16:bitwise_or(
sparx@uint16:bitwise_shift_left(X, N),
sparx@uint16:bitwise_shift_right(X, 16 - N)
).
-file("src/sparx.gleam", 14).
-spec a(sparx@uint16:uint16(), sparx@uint16:uint16()) -> {sparx@uint16:uint16(),
sparx@uint16:uint16()}.
a(L, R) ->
L@1 = sparx@uint16:unsafe_from_int(
sparx@uint16:to_int(rotl(L, 9)) + sparx@uint16:to_int(R)
),
R@1 = 'xor'(rotl(R, 2), L@1),
{L@1, R@1}.
-file("src/sparx.gleam", 20).
-spec a_inv(sparx@uint16:uint16(), sparx@uint16:uint16()) -> {sparx@uint16:uint16(),
sparx@uint16:uint16()}.
a_inv(L, R) ->
R@1 = 'xor'(R, L),
R@2 = rotl(R@1, 14),
L@1 = sparx@uint16:unsafe_from_int(
sparx@uint16:to_int(L) - sparx@uint16:to_int(R@2)
),
L@2 = rotl(L@1, 7),
{L@2, R@2}.
-file("src/sparx.gleam", 31).
-spec l_2_mix(
{sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}
) -> {sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}.
l_2_mix(X) ->
{X0, X1, X2, X3} = X,
Tmp = rotl('xor'(X0, X1), 8),
{X0, X1, 'xor'('xor'(X0, Tmp), X2), 'xor'('xor'(X1, Tmp), X3)}.
-file("src/sparx.gleam", 39).
-spec l_2_swap(
{sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}
) -> {sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}.
l_2_swap(X) ->
{X0, X1, X2, X3} = X,
{X2, X3, X0, X1}.
-file("src/sparx.gleam", 46).
-spec l_2(
{sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}
) -> {sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}.
l_2(X) ->
l_2_swap(l_2_mix(X)).
-file("src/sparx.gleam", 52).
-spec l_2_inv(
{sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}
) -> {sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}.
l_2_inv(X) ->
l_2_mix(l_2_swap(X)).
-file("src/sparx.gleam", 70).
-spec l_4(
{sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}
) -> {sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}.
l_4(X) ->
{X0, X1, X2, X3, X4, X5, X6, X7} = X,
Tmp = rotl('xor'('xor'(X0, X1), 'xor'(X2, X3)), 8),
X4@1 = 'xor'('xor'(X4, X2), Tmp),
X5@1 = 'xor'('xor'(X5, X1), Tmp),
X6@1 = 'xor'('xor'(X6, X0), Tmp),
X7@1 = 'xor'('xor'(X7, X3), Tmp),
{X4@1, X5@1, X6@1, X7@1, X0, X1, X2, X3}.
-file("src/sparx.gleam", 81).
-spec l_4_inv(
{sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}
) -> {sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16(),
sparx@uint16:uint16()}.
l_4_inv(X) ->
{X0, X1, X2, X3, X4, X5, X6, X7} = X,
{X0@1, X1@1, X2@1, X3@1, X4@1, X5@1, X6@1, X7@1} = {X4,
X5,
X6,
X7,
X0,
X1,
X2,
X3},
Tmp = rotl('xor'('xor'(X0@1, X1@1), 'xor'(X2@1, X3@1)), 8),
X4@2 = 'xor'('xor'(X4@1, X2@1), Tmp),
X5@2 = 'xor'('xor'(X5@1, X1@1), Tmp),
X6@2 = 'xor'('xor'(X6@1, X0@1), Tmp),
X7@2 = 'xor'('xor'(X7@1, X3@1), Tmp),
{X0@1, X1@1, X2@1, X3@1, X4@2, X5@2, X6@2, X7@2}.