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
131
132
133
134
135
|
package cz.crcs.ectester.standalone.libs.jni;
import cz.crcs.ectester.common.util.ByteUtil;
import cz.crcs.ectester.common.util.ECUtil;
import org.bouncycastle.util.Arrays;
import java.security.interfaces.ECPublicKey;
import java.security.spec.ECParameterSpec;
import java.security.spec.ECPoint;
/**
* @author Jan Jancar johny@neuromancer.sk
*/
public abstract class NativeECPublicKey implements ECPublicKey {
private String algorithm;
private String format;
ECParameterSpec params;
public NativeECPublicKey(String algorithm, String format, ECParameterSpec params) {
this.algorithm = algorithm;
this.format = format;
this.params = params;
}
@Override
public String getAlgorithm() {
return algorithm;
}
@Override
public String getFormat() {
return format;
}
@Override
public ECParameterSpec getParams() {
return params;
}
public abstract byte[] getData();
private static class ANSIX962 extends NativeECPublicKey {
byte[] keyData;
public ANSIX962(byte[] keyData, ECParameterSpec params) {
super("EC", "ANSI X9.62", params);
this.keyData = Arrays.clone(keyData);
}
@Override
public ECPoint getW() {
return ECUtil.fromX962(keyData, params.getCurve());
}
@Override
public byte[] getEncoded() {
return Arrays.clone(keyData);
}
public byte[] getData() {
return ECUtil.toX962Uncompressed(getW(), params);
}
}
public static class TomCrypt extends ANSIX962 {
public TomCrypt(byte[] keyData, ECParameterSpec params) {
super(keyData, params);
}
}
public static class Botan extends ANSIX962 {
public Botan(byte[] keyData, ECParameterSpec params) {
super(keyData, params);
}
}
public static class Cryptopp extends ANSIX962 {
public Cryptopp(byte[] keyData, ECParameterSpec params) {
super(keyData, params);
}
}
public static class Openssl extends ANSIX962 {
public Openssl(byte[] keyData, ECParameterSpec params) {
super(keyData, params);
}
}
public static class Boringssl extends ANSIX962 {
public Boringssl(byte[] keyData, ECParameterSpec params) {
super(keyData, params);
}
}
public static class Mscng extends ANSIX962 {
// 0 -> implicit (meta = curveName UTF16, header = full);
// 1 -> explicit (meta = null, header = full);
// 2 -> nist (meta = null, header = full)
private int flag;
private byte[] meta = null;
private byte[] header;
private byte[] x;
private byte[] y;
public Mscng(int flag, byte[] meta, byte[] header, byte[] x, byte[] y, ECParameterSpec params) {
super(ByteUtil.concatenate(new byte[]{0x04}, x, y), params);
this.flag = flag;
this.meta = Arrays.clone(meta);
this.header = Arrays.clone(header);
this.x = Arrays.clone(x);
this.y = Arrays.clone(y);
}
public int getFlag() {
return flag;
}
public byte[] getMeta() {
return Arrays.clone(meta);
}
public byte[] getHeader() {
return Arrays.clone(header);
}
public byte[] getBlob() {
return ByteUtil.concatenate(header, x, y);
}
@Override
public byte[] getData() {
return getBlob();
}
}
}
|