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 NULL byte padding to a block.
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class ZeroBytePadding
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 "ZeroByte";
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        int added = (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] = (byte) 0;
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            inOff++;
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return added;
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.length;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (count > 0)
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (in[count - 1] != 0)
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            count--;
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return in.length - count;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
74