diff options
Diffstat (limited to 'core/src/main/java/org/spongycastle/crypto/paddings/TBCPadding.java')
-rw-r--r-- | core/src/main/java/org/spongycastle/crypto/paddings/TBCPadding.java | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/core/src/main/java/org/spongycastle/crypto/paddings/TBCPadding.java b/core/src/main/java/org/spongycastle/crypto/paddings/TBCPadding.java new file mode 100644 index 00000000..4b8190df --- /dev/null +++ b/core/src/main/java/org/spongycastle/crypto/paddings/TBCPadding.java @@ -0,0 +1,89 @@ +package org.spongycastle.crypto.paddings; + +import java.security.SecureRandom; + +import org.spongycastle.crypto.InvalidCipherTextException; + +/** + * A padder that adds Trailing-Bit-Compliment padding to a block. + * <p> + * This padding pads the block out with the compliment of the last bit + * of the plain text. + * </p> + */ +public class TBCPadding + implements BlockCipherPadding +{ + /** + * Initialise the padder. + * + * @param random - a SecureRandom if available. + */ + public void init(SecureRandom random) + throws IllegalArgumentException + { + // nothing to do. + } + + /** + * Return the name of the algorithm the padder implements. + * + * @return the name of the algorithm the padder implements. + */ + public String getPaddingName() + { + return "TBC"; + } + + /** + * add the pad bytes to the passed in block, returning the + * number of bytes added. + * <p> + * Note: this assumes that the last block of plain text is always + * passed to it inside in. i.e. if inOff is zero, indicating the + * entire block is to be overwritten with padding the value of in + * should be the same as the last block of plain text. + * </p> + */ + public int addPadding( + byte[] in, + int inOff) + { + int count = in.length - inOff; + byte code; + + if (inOff > 0) + { + code = (byte)((in[inOff - 1] & 0x01) == 0 ? 0xff : 0x00); + } + else + { + code = (byte)((in[in.length - 1] & 0x01) == 0 ? 0xff : 0x00); + } + + while (inOff < in.length) + { + in[inOff] = code; + inOff++; + } + + return count; + } + + /** + * return the number of pad bytes present in the block. + */ + public int padCount(byte[] in) + throws InvalidCipherTextException + { + byte code = in[in.length - 1]; + + int index = in.length - 1; + while (index > 0 && in[index - 1] == code) + { + index--; + } + + return in.length - index; + } +} |