summaryrefslogtreecommitdiffstats
blob: 36f8f80ee660fa0b7e8027bd674406ac771011dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
 * Copyright (c) 2010, Isode Limited, London, England.
 * All rights reserved.
 */
/*
 * Copyright (c) 2010, Remko Tronçon.
 * All rights reserved.
 */
package com.isode.stroke.stringcodecs;

import com.isode.stroke.base.ByteArray;

public class HMACSHA1 {

    private static final int B = 64;

    public static ByteArray getResult(ByteArray key, ByteArray data) {
        assert key.getSize() <= B;

        /* And an assert that does something */
        if (key.getSize() > B) {
            throw new IllegalStateException("Invalid key size.");
        }

        // Create the padded key
        ByteArray paddedKey = new ByteArray(key);
        for (int i = key.getSize(); i < B; ++i) {
            paddedKey.append((byte) 0x0);
        }

        // Create the first value
        ByteArray x = new ByteArray(paddedKey);
        byte[] xInner = x.getData();
        for (int i = 0; i < xInner.length; ++i) {
            xInner[i] ^= 0x36;
        }
        x = new ByteArray(xInner);
        x.append(data);

        // Create the second value
        ByteArray y = new ByteArray(paddedKey);
        byte[] yInner = y.getData();
        for (int i = 0; i < yInner.length; ++i) {
            yInner[i] ^= 0x5c;
        }
        y = new ByteArray(yInner);
        y.append(SHA1.getHash(x));

        return SHA1.getHash(y);
    }
}