aboutsummaryrefslogtreecommitdiff
path: root/src/cz/crcs/ectester/standalone/test/base/SignatureTestable.java
blob: b8db7b83b835dee447ee3e81105009f03415f74c (plain) (blame)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package cz.crcs.ectester.standalone.test.base;

import java.security.InvalidKeyException;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.SignatureException;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;

/**
 * @author Jan Jancar johny@neuromancer.sk
 */
public class SignatureTestable extends StandaloneTestable<SignatureTestable.SignatureStage> {
    private Signature sig;
    private ECPrivateKey signKey;
    private ECPublicKey verifyKey;
    private KeyGeneratorTestable kgt;
    private byte[] data;
    private byte[] signature;
    private boolean verified;

    public SignatureTestable(Signature sig, ECPrivateKey signKey, ECPublicKey verifyKey, byte[] data) {
        this.sig = sig;
        this.signKey = signKey;
        this.verifyKey = verifyKey;
        this.data = data;
        if (data == null) {
            SecureRandom random = new SecureRandom();
            this.data = new byte[64];
            random.nextBytes(this.data);
        }
    }

    public SignatureTestable(Signature sig, KeyGeneratorTestable kgt, byte[] data) {
        this(sig, null, null, data);
        this.kgt = kgt;
    }

    public Signature getSig() {
        return sig;
    }

    public byte[] getData() {
        return data;
    }

    public byte[] getSignature() {
        return signature;
    }

    public boolean getVerified() {
        return verified;
    }

    @Override
    public void run() {
        try {
            stage = SignatureStage.GetKeys;
            if (kgt != null) {
                signKey = (ECPrivateKey) kgt.getKeyPair().getPrivate();
                verifyKey = (ECPublicKey) kgt.getKeyPair().getPublic();
            }

            stage = SignatureStage.InitSign;
            try {
                sig.initSign(signKey);
            } catch (InvalidKeyException e) {
                failOnException(e);
                return;
            }

            stage = SignatureStage.UpdateSign;
            try {
                sig.update(data);
            } catch (SignatureException e) {
                failOnException(e);
                return;
            }

            stage = SignatureStage.Sign;
            try {
                signature = sig.sign();
            } catch (SignatureException e) {
                failOnException(e);
                return;
            }

            stage = SignatureStage.InitVerify;
            try {
                sig.initVerify(verifyKey);
            } catch (InvalidKeyException e) {
                failOnException(e);
                return;
            }

            stage = SignatureStage.UpdateVerify;
            try {
                sig.update(data);
            } catch (SignatureException e) {
                failOnException(e);
                return;
            }

            stage = SignatureStage.Verify;
            try {
                verified = sig.verify(signature);
            } catch (SignatureException e) {
                failOnException(e);
                return;
            }

            ok = verified;
        } catch (Exception ex) {
            ok = false;
            error = true;
            errorCause = ex;
        }
        hasRun = true;
    }

    public enum SignatureStage {
        GetKeys,
        InitSign,
        UpdateSign,
        Sign,
        InitVerify,
        UpdateVerify,
        Verify
    }
}