Add remove padding
This commit is contained in:
parent
25c292662a
commit
be9181698a
@ -8,14 +8,12 @@
|
|||||||
* Mozilla Public License, v. 2.0).
|
* Mozilla Public License, v. 2.0).
|
||||||
* Authors: $(LINK2 mailto:belka@caraus.de, Eugene Wissner)
|
* Authors: $(LINK2 mailto:belka@caraus.de, Eugene Wissner)
|
||||||
*/
|
*/
|
||||||
module tanya.crypto.padding;
|
module tanya.crypto.cipher;
|
||||||
|
|
||||||
import tanya.memory;
|
import tanya.memory;
|
||||||
import std.algorithm.iteration;
|
import std.algorithm.iteration;
|
||||||
import std.typecons;
|
import std.typecons;
|
||||||
|
|
||||||
@nogc:
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Supported padding mode.
|
* Supported padding mode.
|
||||||
*
|
*
|
||||||
@ -31,13 +29,13 @@ enum Mode
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Params:
|
* Params:
|
||||||
* allocator = Allocator that should be used if the block should be extended
|
|
||||||
* or a new block should be added.
|
|
||||||
* input = Sequence that should be padded.
|
* input = Sequence that should be padded.
|
||||||
* mode = Padding mode.
|
* mode = Padding mode.
|
||||||
* blockSize = Block size.
|
* blockSize = Block size.
|
||||||
|
* allocator = Allocator that should be used if the block should be extended
|
||||||
|
* or a new block should be added.
|
||||||
*
|
*
|
||||||
* Returns: The functions modifies the initial array and returns it.
|
* Returns: The function modifies the initial array and returns it.
|
||||||
*
|
*
|
||||||
* See_Also:
|
* See_Also:
|
||||||
* $(D_PSYMBOL Mode)
|
* $(D_PSYMBOL Mode)
|
||||||
@ -189,3 +187,93 @@ unittest
|
|||||||
defaultAllocator.finalize(input);
|
defaultAllocator.finalize(input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Params:
|
||||||
|
* input = Sequence that should be padded.
|
||||||
|
* mode = Padding mode.
|
||||||
|
* blockSize = Block size.
|
||||||
|
* allocator = Allocator that should be used for freeing the space allocated
|
||||||
|
* for the padding.
|
||||||
|
*
|
||||||
|
* Returns: The function modifies the initial array and returns it.
|
||||||
|
*
|
||||||
|
* See_Also:
|
||||||
|
* $(D_PSYMBOL applyPadding)
|
||||||
|
*/
|
||||||
|
ref ubyte[] removePadding(ref ubyte[] input,
|
||||||
|
in Mode mode,
|
||||||
|
in ushort blockSize,
|
||||||
|
Allocator allocator = defaultAllocator)
|
||||||
|
in
|
||||||
|
{
|
||||||
|
assert(input.length != 0);
|
||||||
|
assert(input.length % 64 == 0);
|
||||||
|
}
|
||||||
|
body
|
||||||
|
{
|
||||||
|
final switch (mode) with (Mode)
|
||||||
|
{
|
||||||
|
case zero:
|
||||||
|
break;
|
||||||
|
case pkcs7:
|
||||||
|
case ansiX923:
|
||||||
|
immutable last = input[$ - 1];
|
||||||
|
|
||||||
|
allocator.shrinkArray(input, last ? last : blockSize);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
unittest
|
||||||
|
{
|
||||||
|
{ // Zeros
|
||||||
|
auto input = defaultAllocator.makeArray!ubyte(50);
|
||||||
|
auto inputDup = defaultAllocator.makeArray!ubyte(50);
|
||||||
|
|
||||||
|
applyPadding(input, Mode.zero, 64);
|
||||||
|
applyPadding(inputDup, Mode.zero, 64);
|
||||||
|
|
||||||
|
removePadding(input, Mode.zero, 64);
|
||||||
|
assert(input == inputDup);
|
||||||
|
|
||||||
|
defaultAllocator.finalize(input);
|
||||||
|
defaultAllocator.finalize(inputDup);
|
||||||
|
|
||||||
|
}
|
||||||
|
{ // PKCS#7
|
||||||
|
auto input = defaultAllocator.makeArray!ubyte(50);
|
||||||
|
auto inputDup = defaultAllocator.makeArray!ubyte(50);
|
||||||
|
for (ubyte i; i < 40; ++i)
|
||||||
|
{
|
||||||
|
input[i] = i;
|
||||||
|
inputDup[i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
applyPadding(input, Mode.pkcs7, 64);
|
||||||
|
removePadding(input, Mode.pkcs7, 64);
|
||||||
|
assert(input == inputDup);
|
||||||
|
|
||||||
|
defaultAllocator.finalize(input);
|
||||||
|
defaultAllocator.finalize(inputDup);
|
||||||
|
}
|
||||||
|
{ // ANSI X.923
|
||||||
|
auto input = defaultAllocator.makeArray!ubyte(50);
|
||||||
|
auto inputDup = defaultAllocator.makeArray!ubyte(50);
|
||||||
|
for (ubyte i; i < 40; ++i)
|
||||||
|
{
|
||||||
|
input[i] = i;
|
||||||
|
inputDup[i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
applyPadding(input, Mode.pkcs7, 64);
|
||||||
|
removePadding(input, Mode.pkcs7, 64);
|
||||||
|
assert(input == inputDup);
|
||||||
|
|
||||||
|
defaultAllocator.finalize(input);
|
||||||
|
defaultAllocator.finalize(inputDup);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user