1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.bouncycastle.crypto.paddings;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.SecureRandom;
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.crypto.InvalidCipherTextException;
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A padder that adds PKCS7/PKCS5 padding to a block.
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class PKCS7Padding
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    implements BlockCipherPadding
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Initialise the padder.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param random - a SecureRandom if available.
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void init(SecureRandom random)
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws IllegalArgumentException
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // nothing to do.
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the name of the algorithm the padder implements.
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the name of the algorithm the padder implements.
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getPaddingName()
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "PKCS7";
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * add the pad bytes to the passed in block, returning the
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * number of bytes added.
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int addPadding(
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]  in,
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     inOff)
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte code = (byte)(in.length - inOff);
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (inOff < in.length)
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            in[inOff] = code;
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            inOff++;
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return code;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the number of pad bytes present in the block.
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int padCount(byte[] in)
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws InvalidCipherTextException
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int count = in[in.length - 1] & 0xff;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (count > in.length)
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new InvalidCipherTextException("pad block corrupted");
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 1; i <= count; i++)
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (in[in.length - i] != count)
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                throw new InvalidCipherTextException("pad block corrupted");
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return count;
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
77