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 X9.23 padding to a block - if a SecureRandom is
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * passed in random padding is assumed, otherwise padding with zeros is used.
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class X923Padding
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    implements BlockCipherPadding
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SecureRandom    random = null;
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Initialise the padder.
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param random a SecureRandom if one is available.
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void init(SecureRandom random)
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws IllegalArgumentException
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.random = random;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the name of the algorithm the padder implements.
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the name of the algorithm the padder implements.
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getPaddingName()
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "X9.23";
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * add the pad bytes to the passed in block, returning the
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * number of bytes added.
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int addPadding(
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[]  in,
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     inOff)
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte code = (byte)(in.length - inOff);
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (inOff < in.length - 1)
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (random == null)
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                in[inOff] = 0;
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            {
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                in[inOff] = (byte)random.nextInt();
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            inOff++;
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        in[inOff] = code;
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return code;
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * return the number of pad bytes present in the block.
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int padCount(byte[] in)
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throws InvalidCipherTextException
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int count = in[in.length - 1] & 0xff;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (count > in.length)
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new InvalidCipherTextException("pad block corrupted");
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return count;
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
81