diff options
Diffstat (limited to 'core/src/main/java/org/spongycastle/crypto/paddings/ISO7816d4Padding.java')
-rw-r--r-- | core/src/main/java/org/spongycastle/crypto/paddings/ISO7816d4Padding.java | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/core/src/main/java/org/spongycastle/crypto/paddings/ISO7816d4Padding.java b/core/src/main/java/org/spongycastle/crypto/paddings/ISO7816d4Padding.java new file mode 100644 index 00000000..d187e445 --- /dev/null +++ b/core/src/main/java/org/spongycastle/crypto/paddings/ISO7816d4Padding.java @@ -0,0 +1,77 @@ +package org.spongycastle.crypto.paddings; + +import java.security.SecureRandom; + +import org.spongycastle.crypto.InvalidCipherTextException; + +/** + * A padder that adds the padding according to the scheme referenced in + * ISO 7814-4 - scheme 2 from ISO 9797-1. The first byte is 0x80, rest is 0x00 + */ +public class ISO7816d4Padding + 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 "ISO7816-4"; + } + + /** + * add the pad bytes to the passed in block, returning the + * number of bytes added. + */ + public int addPadding( + byte[] in, + int inOff) + { + int added = (in.length - inOff); + + in [inOff]= (byte) 0x80; + inOff ++; + + while (inOff < in.length) + { + in[inOff] = (byte) 0; + inOff++; + } + + return added; + } + + /** + * return the number of pad bytes present in the block. + */ + public int padCount(byte[] in) + throws InvalidCipherTextException + { + int count = in.length - 1; + + while (count > 0 && in[count] == 0) + { + count--; + } + + if (in[count] != (byte)0x80) + { + throw new InvalidCipherTextException("pad block corrupted"); + } + + return in.length - count; + } +} |