📄 deriobuffer.java
字号:
new Integer(in[j + 2 + (in[j + 1] & 0x7f) + k]), vec.size()); } out.insertElementAt(vec, out.size()); j += (1 + in[j + 1] & 0x7f) + l; } else { // Short for (k = j; k <= j + 1 + in[j + 1]; k++) { vec.insertElementAt(new Integer(in[k]), vec.size()); } out.insertElementAt(vec, out.size()); j += 1 + in[j + 1]; } vec = new Vector(); } return out; } protected static int[] DerSeqEncode(int[] der_rep) { Vector v = Utils.OS2V(der_rep); DerInsertLength(v, 0x30); int[] b = Utils.Vector2OS(v); return b; } protected static int[] DerSeqEncode(Vector in) { int[] seq_rep = Utils.Vector2OS((Vector) in.elementAt(0)); for (int i = 1; i < in.size(); i++) { seq_rep = Utils.concatenate( seq_rep, Utils.Vector2OS((Vector) in.elementAt(i))); } Vector v = Utils.OS2V(seq_rep); DerInsertLength(v, 0x30); seq_rep = Utils.Vector2OS(v); return seq_rep; } protected static int DerExtractLength(Vector data) { int length = 0; data.removeElementAt(0); // erase DER type OCTET if ((((Integer) data.elementAt(0)).intValue() & 0x80) != 0) { // Long for (int j = 1; j <= (((Integer) data.elementAt(0)).intValue() & 0x7f); j++) { length *= 0x100; length += ((Integer) data.elementAt(j)).intValue(); } int k = ((Integer) data.elementAt(0)).intValue() & 0x0f; for (int l = 0; l < k + 1; l++) { data.removeElementAt(0); } } else { // Short length = ((Integer) data.elementAt(0)).intValue(); data.removeElementAt(0); } if (length != data.size()) length = 0; return length; } protected static void DerInsertLength(Vector data, int DerTypeOctet) { if (data.size() > 127) { // long form long length = data.size(); int no_octets = 0x80; while (length != 0) { data.insertElementAt(new Integer((int) (length % 256)), 0); length /= 256; no_octets++; } data.insertElementAt(new Integer((int) no_octets), 0); } else { // short form data.insertElementAt(new Integer((int) (data.size())), 0); } data.insertElementAt(new Integer((int) DerTypeOctet), 0); } /** * Constructor */ /*public DerIOBuffer (int[] data) { this.data = new int[data.length]; for (int i=0; i<data.length; i++) { this.data[i] = data[i]; } }*/ /** * Constructor */ public DerIOBuffer(byte[] data) { this.data = Utils.toIntArray(data); } protected static int[] DER_Encode(ECPubKey pk) { Vector algorithmidentifier = new Vector(); // 06 Length (40*01+02+840+10045+02+01=) Vector a = new Vector(); Vector algorithm = new Vector(9); algorithm.insertElementAt(new Integer(0x06), 0); algorithm.insertElementAt(new Integer(0x07), 1); algorithm.insertElementAt(new Integer(0x2a), 2); algorithm.insertElementAt(new Integer(0x86), 3); algorithm.insertElementAt(new Integer(0x48), 4); algorithm.insertElementAt(new Integer(0xce), 5); algorithm.insertElementAt(new Integer(0x3d), 6); algorithm.insertElementAt(new Integer(0x02), 7); algorithm.insertElementAt(new Integer(0x01), 8); a.insertElementAt(algorithm, a.size()); // version // EC domain parameters a.insertElementAt(Utils.OS2V(DER_Encode(pk.dp)), a.size()); algorithmidentifier = Utils.OS2V(DerSeqEncode(a)); Vector buf = new Vector(); buf.insertElementAt(algorithmidentifier, buf.size()); Vector ecpoint = DER_Encode((ECPointF2m) pk.W); // public key ecpoint.insertElementAt(new Integer(0x00), 0); if (ecpoint.size() > 127) { int size = ecpoint.size(); int no_octets = 0; while (size > 0) { ecpoint.insertElementAt(new Integer(size % 0x100), 0); size /= 0x100; no_octets++; } no_octets |= 0x80; ecpoint.insertElementAt(new Integer(no_octets), 0); } else { ecpoint.insertElementAt(new Integer(ecpoint.size()), 0); } ecpoint.insertElementAt(new Integer(0x03), 0); buf.insertElementAt(ecpoint, buf.size()); int[] der_rep = DerSeqEncode(buf); return der_rep; } protected static ECPubKey DER2ECPubKey(int[] der_rep) throws Exception { if (der_rep[0] != 0x30) throw (new Exception("DER2ECPrivKey: Not a Sequence")); Vector buf = DerSeqDecode(der_rep); Vector a = DerSeqDecode(Utils.Vector2OS((Vector) buf.elementAt(0))); // buf[0] // 06 Length (40*01+02+840+10045+02+01=) // a[0] // algorithm[0] = 0x06; algorithm[1] = 0x07; algorithm[2] = 0x2A; // algorithm[3] = 0x86; algorithm[4] = 0x48; algorithm[5] = 0xCE; // algorithm[6] = 0x3D; algorithm[7] = 0x02; algorithm[8] = 0x01; int algorithm = ((Integer) (((Vector) a.elementAt(0)).elementAt(8))).intValue(); if (algorithm != 0x01) throw (new Exception("DER2ECPubKey: Invalid Algorithm")); // a[1] ECDomainParameters dp = DER2ECDP(Utils.Vector2OS((Vector) a.elementAt(1))); // buf[1] if (((Integer) ((Vector) buf.elementAt(1)).elementAt(0)).intValue() != 0x03) throw (new Exception("DER2ECPubKey: ECPOINT Invalid")); else { // Use this to delete the length OCTETs int length = DerExtractLength((Vector) buf.elementAt(1)); // delete 0x00 OCTET ((Vector) buf.elementAt(1)).removeElementAt(0); } ECPointF2m W = DER2Point(Utils.Vector2OS((Vector) buf.elementAt(1))); ECPubKey pk = new ECPubKey(dp, W); return pk; } protected static int[] DER_Encode(ECPrivKey sk) { Vector v = new Vector(); v.insertElementAt(DER_Encode(1), v.size()); // version v.insertElementAt(DER_Encode(sk.s), v.size()); // private key v.insertElementAt(Utils.OS2V(DER_Encode(sk.dp)), v.size()); // EC domain parameters int[] der_rep = DerSeqEncode(v); return der_rep; } protected static ECPrivKey DER2ECPrivKey(int[] der_rep) throws Exception { if (der_rep[0] != 0x30) throw (new Exception("DER2ECPrivKey: Not a Sequence")); Vector v = DerSeqDecode(der_rep); if (DER2BigInt(Utils.Vector2OS((Vector) v.elementAt(0))).intValue() != 0x01) throw (new Exception("DER2ECPrivKey: Unsupported Version")); BigInteger s = DER2BigInt(Utils.Vector2OS((Vector) v.elementAt(1))); ECDomainParameters dp = DER2ECDP(Utils.Vector2OS((Vector) v.elementAt(2))); ECPrivKey sk = new ECPrivKey(dp, s); return sk; } protected static int[] DER_Encode(ECDSA sig) { Vector AlgorithmIdentifier = new Vector(); // 06 Length (40*01+02+840+10045+02+01=) Vector alg = new Vector(9); alg.insertElementAt(new Integer(0x06), 0); alg.insertElementAt(new Integer(0x07), 1); alg.insertElementAt(new Integer(0x2a), 2); alg.insertElementAt(new Integer(0x86), 3); alg.insertElementAt(new Integer(0x48), 4); alg.insertElementAt(new Integer(0xce), 5); alg.insertElementAt(new Integer(0x3d), 6); alg.insertElementAt(new Integer(0x02), 7); alg.insertElementAt(new Integer(0x01), 8); Vector algid_buf = new Vector(); algid_buf.insertElementAt(alg, algid_buf.size()); // algorithm AlgorithmIdentifier = Utils.OS2V(DerSeqEncode(algid_buf)); Vector ECDSA_Sig_Value = new Vector(); Vector sigval_buf = new Vector(); sigval_buf.insertElementAt(DER_Encode(sig.c), sigval_buf.size()); // r in X9.62 sigval_buf.insertElementAt(DER_Encode(sig.d), sigval_buf.size()); // s in X9.62 ECDSA_Sig_Value = Utils.OS2V(DerSeqEncode(sigval_buf)); Vector buf = new Vector(); buf.insertElementAt(AlgorithmIdentifier, buf.size()); buf.insertElementAt(ECDSA_Sig_Value, buf.size()); int[] der_rep = DerSeqEncode(buf); return der_rep; } protected static ECDSA DER2ECSignature(int[] der_rep) throws Exception { if (der_rep[0] != 0x30) throw (new Exception("DER2ECSignature: Not a Sequence")); Vector buf = DerSeqDecode(der_rep); Vector a = DerSeqDecode(Utils.Vector2OS((Vector) buf.elementAt(0))); // buf[0] // 06 Length (40*01+02+840+10045+02+01=) // a[0] // algorithm[0] = 0x06; algorithm[1] = 0x07; algorithm[2] = 0x2A; // algorithm[3] = 0x86; algorithm[4] = 0x48; algorithm[5] = 0xCE; // algorithm[6] = 0x3D; algorithm[7] = 0x02; algorithm[8] = 0x01; int algorithm = ((Integer) (((Vector) a.elementAt(0)).elementAt(8))).intValue(); if (algorithm != 0x01) throw (new Exception("DER2ECSignature: Invalid Algorithm")); Vector b = DerSeqDecode(Utils.Vector2OS((Vector) buf.elementAt(1))); // c is r in X9.62, d is s in X9.62 BigInteger c = DER2BigInt(Utils.Vector2OS((Vector) b.elementAt(0))); BigInteger d = DER2BigInt(Utils.Vector2OS((Vector) b.elementAt(1))); return new ECDSA(c, d); } protected static int[] DER_Encode(ECIES ct) { Vector buf = new Vector(); buf.insertElementAt(Utils.OS2V(DER_Encode(ct.V)), buf.size()); buf.insertElementAt((DER_Encode(ct.C)), buf.size()); buf.insertElementAt((DER_Encode(ct.T)), buf.size()); int[] der_rep = DerSeqEncode(buf); return der_rep; } protected static ECIES DER2ECIES(int[] der_rep) throws Exception { if (der_rep[0] != 0x30) throw (new Exception("DER2ECIES: Not a Sequence")); Vector buf = DerSeqDecode(der_rep); ECPubKey V = DER2ECPubKey(Utils.Vector2OS((Vector) buf.elementAt(0))); int C[] = Utils.Vector2OS(DER2OCTETSTR((Vector) buf.elementAt(1))); int T[] = Utils.Vector2OS(DER2OCTETSTR((Vector) buf.elementAt(2))); return new ECIES(V, C, T); } /** * Constructor */ public DerIOBuffer(ECDomainParameters dp) { data = DER_Encode(dp); } public ECDomainParameters toECDP() throws Exception { return DER2ECDP(data); } /** * Constructor */ public DerIOBuffer(ECPubKey pubKey) { data = DER_Encode(pubKey); } public ECPubKey toECPubKey() throws Exception { return DER2ECPubKey(data); } /** * Constructor */ public DerIOBuffer(ECPrivKey privKey) { data = DER_Encode(privKey); } public ECPrivKey toECPrivKey() throws Exception { return DER2ECPrivKey(data); } /** * Constructor */ public DerIOBuffer(ECDSA sig) { data = DER_Encode(sig); } public ECDSA toECSignature() throws Exception { return DER2ECSignature(data); } /** * Constructor */ public DerIOBuffer(ECIES ct) { data = DER_Encode(ct); } public ECIES toECIES() throws Exception { return DER2ECIES(data); } public byte[] toByteArray() { return Utils.toByteArray(data); } public String toString() { String s = new String(); for (int i = 0; i < data.length; i++) { if (data[i] < 16) s = s.concat("0"); s = s.concat(BigInteger.valueOf(data[i]).toString(16)); s = s.concat(","); } return s; } protected Object clone() { return new DerIOBuffer(Utils.toByteArray(data)); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -