public class DSTU7624Mac extends java.lang.Object implements Mac
This is a CBC-MAC variant (a CBC chain whose final block is masked with kDelta = E(0) before the
last encryption) and, like raw CBC-MAC, it is defined only for input that is a whole number of
blocks: doFinal(byte[], int) rejects a trailing partial block with "input must be a multiple of
blocksize". The restriction is deliberate and is not relaxed by zero-padding the final
block. The MAC binds no message length, so zero-padding a partial block would make the tag of an
N-byte message collide with that of a longer message sharing the same final block once padded
(the documented ambiguity of ISO/IEC 9797-1 padding method 1). DSTU 7624:2014 specifies no
partial-block padding for this MAC and publishes no vector for one, so any padding scheme BC chose
(zero-pad, or the unambiguous 10* / ISO 9797-1 method 2 that CMAC uses) would be non-conformant
and non-interoperable. Callers needing to authenticate arbitrary-length input should pad to a
block boundary with an agreed scheme before calling update, or use a length-binding MAC such as
KGMac. See github #287.
| Constructor and Description |
|---|
DSTU7624Mac(int blockBitLength,
int q) |
| Modifier and Type | Method and Description |
|---|---|
int |
doFinal(byte[] out,
int outOff)
Compute the final stage of the MAC writing the output to the out
parameter.
|
java.lang.String |
getAlgorithmName()
Return the name of the algorithm the MAC implements.
|
int |
getMacSize()
Return the block size for this MAC (in bytes).
|
void |
init(CipherParameters params)
Initialise the MAC.
|
void |
reset()
Reset the MAC.
|
void |
update(byte in)
add a single byte to the mac for processing.
|
void |
update(byte[] in,
int inOff,
int len) |
public void init(CipherParameters params) throws java.lang.IllegalArgumentException
Macpublic java.lang.String getAlgorithmName()
MacgetAlgorithmName in interface Macpublic int getMacSize()
MacgetMacSize in interface Macpublic void update(byte in)
Macpublic void update(byte[] in,
int inOff,
int len)
public int doFinal(byte[] out,
int outOff)
throws DataLengthException,
java.lang.IllegalStateException
MacdoFinal leaves the MAC in the same state it was after the last init.
doFinal in interface Macout - the array the MAC is to be output to.outOff - the offset into the out buffer the output is to start at.DataLengthException - if there isn't enough space in out.java.lang.IllegalStateException - if the MAC is not initialised.