Changeset ed9d403


Ignore:
Timestamp:
Jan 24, 2016 9:40:33 PM (5 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
df0aceb
Parents:
f38cfcc
Message:

ElGamal?: Implement key encoding

Location:
core/java/src/net/i2p/crypto
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/crypto/SigUtil.java

    rf38cfcc red9d403  
    717717     *  @since 0.9.25
    718718     */
    719     private static int intToASN1(byte[] d, int idx, int val) {
     719    public static int intToASN1(byte[] d, int idx, int val) {
    720720        if (val < 0 || val > 65535)
    721721            throw new IllegalArgumentException("fixme length " + val);
  • core/java/src/net/i2p/crypto/elgamal/impl/ElGamalPrivateKeyImpl.java

    rf38cfcc red9d403  
    1111import javax.crypto.spec.DHPrivateKeySpec;
    1212
     13import static net.i2p.crypto.SigUtil.intToASN1;
    1314import net.i2p.crypto.elgamal.ElGamalPrivateKey;
     15import static net.i2p.crypto.elgamal.impl.ElGamalPublicKeyImpl.spaceFor;
    1416import net.i2p.crypto.elgamal.spec.ElGamalParameterSpec;
    1517import net.i2p.crypto.elgamal.spec.ElGamalPrivateKeySpec;
     
    9496    public byte[] getEncoded()
    9597    {
    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;
    97154    }
    98155
  • core/java/src/net/i2p/crypto/elgamal/impl/ElGamalPublicKeyImpl.java

    rf38cfcc red9d403  
    1111import javax.crypto.spec.DHPublicKeySpec;
    1212
     13import static net.i2p.crypto.SigUtil.intToASN1;
    1314import net.i2p.crypto.elgamal.ElGamalPublicKey;
    1415import net.i2p.crypto.elgamal.spec.ElGamalParameterSpec;
     
    7980    public byte[] getEncoded()
    8081    {
    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;
    82145    }
    83146
Note: See TracChangeset for help on using the changeset viewer.