Changeset ed9d403
- Timestamp:
- Jan 24, 2016 9:40:33 PM (5 years ago)
- Branches:
- master
- Children:
- df0aceb
- Parents:
- f38cfcc
- Location:
- core/java/src/net/i2p/crypto
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
core/java/src/net/i2p/crypto/SigUtil.java
rf38cfcc red9d403 717 717 * @since 0.9.25 718 718 */ 719 p rivatestatic int intToASN1(byte[] d, int idx, int val) {719 public static int intToASN1(byte[] d, int idx, int val) { 720 720 if (val < 0 || val > 65535) 721 721 throw new IllegalArgumentException("fixme length " + val); -
core/java/src/net/i2p/crypto/elgamal/impl/ElGamalPrivateKeyImpl.java
rf38cfcc red9d403 11 11 import javax.crypto.spec.DHPrivateKeySpec; 12 12 13 import static net.i2p.crypto.SigUtil.intToASN1; 13 14 import net.i2p.crypto.elgamal.ElGamalPrivateKey; 15 import static net.i2p.crypto.elgamal.impl.ElGamalPublicKeyImpl.spaceFor; 14 16 import net.i2p.crypto.elgamal.spec.ElGamalParameterSpec; 15 17 import net.i2p.crypto.elgamal.spec.ElGamalPrivateKeySpec; … … 94 96 public byte[] getEncoded() 95 97 { 96 return null; 98 byte[] pb = elSpec.getP().toByteArray(); 99 byte[] gb = elSpec.getG().toByteArray(); 100 byte[] xb = x.toByteArray(); 101 int seq3len = 2 + spaceFor(pb.length) + spaceFor(gb.length); 102 int seq2len = 8 + 1 + spaceFor(seq3len); 103 int seq1len = 1 + 3 + spaceFor(seq2len) + 1 + spaceFor(xb.length); 104 int totlen = 1 + spaceFor(seq1len); 105 byte[] rv = new byte[totlen]; 106 int idx = 0; 107 // sequence 1 108 rv[idx++] = 0x30; 109 idx = intToASN1(rv, idx, seq1len); 110 111 // version 112 rv[idx++] = 0x02; 113 rv[idx++] = 1; 114 rv[idx++] = 0; 115 116 // Algorithm Identifier 117 // sequence 2 118 rv[idx++] = 0x30; 119 idx = intToASN1(rv, idx, seq2len); 120 // OID: 1.3.14.7.2.1.1 121 rv[idx++] = 0x06; 122 rv[idx++] = 6; 123 rv[idx++] = (1 * 40) + 3; 124 rv[idx++] = 14; 125 rv[idx++] = 7; 126 rv[idx++] = 2; 127 rv[idx++] = 1; 128 rv[idx++] = 1; 129 130 // params 131 // sequence 3 132 rv[idx++] = 0x30; 133 idx = intToASN1(rv, idx, seq3len); 134 // P 135 // integer 136 rv[idx++] = 0x02; 137 idx = intToASN1(rv, idx, pb.length); 138 System.arraycopy(pb, 0, rv, idx, pb.length); 139 idx += pb.length; 140 // G 141 // integer 142 rv[idx++] = 0x02; 143 idx = intToASN1(rv, idx, gb.length); 144 System.arraycopy(gb, 0, rv, idx, gb.length); 145 idx += gb.length; 146 147 // the key 148 // octet string 149 rv[idx++] = 0x04; 150 idx = intToASN1(rv, idx, xb.length); 151 // BC puts an integer in the bit string, we're not going to do that 152 System.arraycopy(xb, 0, rv, idx, xb.length); 153 return rv; 97 154 } 98 155 -
core/java/src/net/i2p/crypto/elgamal/impl/ElGamalPublicKeyImpl.java
rf38cfcc red9d403 11 11 import javax.crypto.spec.DHPublicKeySpec; 12 12 13 import static net.i2p.crypto.SigUtil.intToASN1; 13 14 import net.i2p.crypto.elgamal.ElGamalPublicKey; 14 15 import net.i2p.crypto.elgamal.spec.ElGamalParameterSpec; … … 79 80 public byte[] getEncoded() 80 81 { 81 return null; 82 byte[] pb = elSpec.getP().toByteArray(); 83 byte[] gb = elSpec.getG().toByteArray(); 84 byte[] yb = y.toByteArray(); 85 int seq3len = 2 + spaceFor(pb.length) + spaceFor(gb.length); 86 int seq2len = 8 + 1 + spaceFor(seq3len); 87 int seq1len = 1 + spaceFor(seq2len) + 1 + spaceFor(yb.length + 1); 88 int totlen = 1 + spaceFor(seq1len); 89 byte[] rv = new byte[totlen]; 90 int idx = 0; 91 // sequence 1 92 rv[idx++] = 0x30; 93 idx = intToASN1(rv, idx, seq1len); 94 95 // Algorithm Identifier 96 // sequence 2 97 rv[idx++] = 0x30; 98 idx = intToASN1(rv, idx, seq2len); 99 // OID: 1.3.14.7.2.1.1 100 rv[idx++] = 0x06; 101 rv[idx++] = 6; 102 rv[idx++] = (1 * 40) + 3; 103 rv[idx++] = 14; 104 rv[idx++] = 7; 105 rv[idx++] = 2; 106 rv[idx++] = 1; 107 rv[idx++] = 1; 108 109 // params 110 // sequence 3 111 rv[idx++] = 0x30; 112 idx = intToASN1(rv, idx, seq3len); 113 // P 114 // integer 115 rv[idx++] = 0x02; 116 idx = intToASN1(rv, idx, pb.length); 117 System.arraycopy(pb, 0, rv, idx, pb.length); 118 idx += pb.length; 119 // G 120 // integer 121 rv[idx++] = 0x02; 122 idx = intToASN1(rv, idx, gb.length); 123 System.arraycopy(gb, 0, rv, idx, gb.length); 124 idx += gb.length; 125 126 // the key 127 // bit string 128 rv[idx++] = 0x03; 129 idx = intToASN1(rv, idx, yb.length + 1); 130 rv[idx++] = 0; // number of trailing unused bits 131 // BC puts an integer in the bit string, we're not going to do that 132 System.arraycopy(yb, 0, rv, idx, yb.length); 133 return rv; 134 } 135 136 static int spaceFor(int val) { 137 int rv; 138 if (val > 255) 139 rv = 3; 140 else if (val > 127) 141 rv = 2; 142 else 143 rv = 1; 144 return rv + val; 82 145 } 83 146
Note: See TracChangeset
for help on using the changeset viewer.