Search in sources :

Example 21 with ASN1Object

use of com.github.zhenwei.core.asn1.ASN1Object in project churchkey by tomitribe.

the class FooTest method test2.

@Ignore
@Test
public void test2() throws Exception {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        try (DerWriter w = new DerWriter(baos)) {
            final DerWriter sequence = new DerWriter();
            sequence.integer(BigInteger.valueOf(-1));
            sequence.integer(BigInteger.valueOf(129));
            sequence.integer(new byte[] { 0, 0 }, 0, 2);
            sequence.integer(new byte[] { 0, 1 }, 0, 2);
            sequence.close();
            final byte[] bytes = sequence.bytes();
            // Asn1Dump.print(bytes);
            final Asn1Object sequenceAsn1 = new Asn1Object(Asn1Class.UNIVERSAL, Asn1Type.SEQUENCE, false, bytes.length, bytes);
            w.writeObject(sequenceAsn1);
        }
    } finally {
        baos.close();
    }
    Asn1Dump.print(baos.toByteArray());
}
Also used : ByteArrayOutputStream(java.io.ByteArrayOutputStream) DerWriter(io.churchkey.asn1.DerWriter) Asn1Object(io.churchkey.asn1.Asn1Object) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 22 with ASN1Object

use of com.github.zhenwei.core.asn1.ASN1Object in project churchkey by tomitribe.

the class BeginDsaPrivateKey method decode.

public static Key decode(final byte[] bytes) {
    try {
        final DerParser parser = new DerParser(bytes);
        final Asn1Object sequence = parser.readObject();
        if (sequence.getType() != Asn1Type.SEQUENCE) {
            throw new IllegalArgumentException("Invalid DER: not a sequence");
        }
        // Parse inside the sequence
        final DerParser parser1 = sequence.createParser();
        // Skip version
        parser1.readObject();
        final Dsa.Private build = Dsa.Private.builder().p(parser1.readObject().asInteger()).q(parser1.readObject().asInteger()).g(parser1.readObject().asInteger()).y(parser1.readObject().asInteger()).x(parser1.readObject().asInteger()).build();
        final DSAPrivateKey privateKey = build.toKey();
        final DSAPublicKey publicKey = build.toPublic().toKey();
        return new Key(privateKey, publicKey, Key.Type.PRIVATE, Key.Algorithm.DSA, Key.Format.PEM);
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}
Also used : Dsa(io.churchkey.dsa.Dsa) DSAPrivateKey(java.security.interfaces.DSAPrivateKey) DerParser(io.churchkey.asn1.DerParser) UncheckedIOException(java.io.UncheckedIOException) UncheckedIOException(java.io.UncheckedIOException) IOException(java.io.IOException) DSAPublicKey(java.security.interfaces.DSAPublicKey) DSAPrivateKey(java.security.interfaces.DSAPrivateKey) Key(io.churchkey.Key) Asn1Object(io.churchkey.asn1.Asn1Object) DSAPublicKey(java.security.interfaces.DSAPublicKey)

Example 23 with ASN1Object

use of com.github.zhenwei.core.asn1.ASN1Object in project churchkey by tomitribe.

the class BeginEcPrivateKey method decode.

public static Key decode(final byte[] bytes) {
    try {
        final Ecdsa.Private.Builder ec = Ecdsa.Private.builder();
        final DerParser d1 = new DerParser(bytes);
        final Asn1Object d1o1 = d1.readObject().assertType(Asn1Type.SEQUENCE);
        {
            final DerParser d2 = new DerParser(d1o1.getValue());
            final Asn1Object d2o1 = d2.readObject().assertType(Asn1Type.INTEGER);
            final Asn1Object d2o2 = d2.readObject().assertType(Asn1Type.OCTET_STRING);
            final Asn1Object d2o3 = d2.readObject().assertType(Asn1Type.ANY);
            {
                final DerParser d3 = new DerParser(d2o3.getValue());
                final Asn1Object d3o1 = d3.readObject();
                if (d3o1.isType(Asn1Type.OBJECT_IDENTIFIER)) {
                    final Oid oid = d3o1.asOID();
                    final Curve curve = Curve.resolve(oid);
                    ec.curve(curve);
                } else if (d3o1.isType(Asn1Type.SEQUENCE)) {
                    ec.spec(EcCurveParams.parseSequence(d3o1));
                }
                ec.d(d2o2.toInteger());
            }
            final Asn1Object d2o4 = d2.readObject();
            if (d2o4 != null && d2o4.isType(Asn1Type.BOOLEAN)) {
                final DerParser d3 = new DerParser(d2o4.getValue());
                final Asn1Object d3o1 = d3.readObject().assertType(Asn1Type.BIT_STRING);
                final byte[] value = Bytes.trim(d3o1.getValue());
                final ECPoint ecPoint = EcPoints.fromBytes(value);
                ec.x(ecPoint.getAffineX());
                ec.y(ecPoint.getAffineY());
            }
            final Ecdsa.Private build = ec.build();
            final ECPrivateKey privateKey = build.toKey();
            final ECPublicKey publicKey = build.getX() != null && build.getY() != null ? build.toPublic().toKey() : null;
            return new Key(privateKey, publicKey, Key.Type.PRIVATE, EC, Key.Format.PEM);
        }
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
}
Also used : ECPrivateKey(java.security.interfaces.ECPrivateKey) ECPublicKey(java.security.interfaces.ECPublicKey) Curve(io.churchkey.ec.Curve) DerParser(io.churchkey.asn1.DerParser) UncheckedIOException(java.io.UncheckedIOException) Oid(io.churchkey.asn1.Oid) IOException(java.io.IOException) UncheckedIOException(java.io.UncheckedIOException) ECPoint(java.security.spec.ECPoint) Key(io.churchkey.Key) ECPrivateKey(java.security.interfaces.ECPrivateKey) ECPublicKey(java.security.interfaces.ECPublicKey) Asn1Object(io.churchkey.asn1.Asn1Object)

Example 24 with ASN1Object

use of com.github.zhenwei.core.asn1.ASN1Object in project churchkey by tomitribe.

the class BeginPrivateKey method readKeyType.

private static Oid readKeyType(final byte[] bytes) throws IOException {
    final DerParser d1 = new DerParser(bytes);
    final Asn1Object d1o1 = d1.readObject().assertType(Asn1Type.SEQUENCE);
    {
        final DerParser d2 = new DerParser(d1o1.getValue());
        final Asn1Object d2o1 = d2.readObject().assertType(Asn1Type.INTEGER);
        final Asn1Object d2o2 = d2.readObject().assertType(Asn1Type.SEQUENCE);
        {
            final DerParser d3 = new DerParser(d2o2.getValue());
            final Asn1Object d3o1 = d3.readObject().assertType(Asn1Type.OBJECT_IDENTIFIER);
            return d3o1.asOID();
        }
    }
}
Also used : DerParser(io.churchkey.asn1.DerParser) Asn1Object(io.churchkey.asn1.Asn1Object)

Example 25 with ASN1Object

use of com.github.zhenwei.core.asn1.ASN1Object in project churchkey by tomitribe.

the class BeginPrivateKey method decodeEcKey.

/**
 * EC Keys start out with this wrapper identifying the curve by OID
 *
 *     0:d=0  hl=2 l= 112 cons: SEQUENCE
 *     2:d=1  hl=2 l=   1 prim:  INTEGER           :00
 *     5:d=1  hl=2 l=  20 cons:  SEQUENCE
 *     7:d=2  hl=2 l=   7 prim:   OBJECT            :id-ecPublicKey
 *    16:d=2  hl=2 l=   9 prim:   OBJECT            :brainpoolP192r1
 *    27:d=1  hl=2 l=  85 prim:  OCTET STRING
 *       0000 - 30 53 02 01 01 04 18 88-9f 26 37 f9 f5 1f da 16   0S.......&7.....
 *       0010 - 1c b0 4c ce 79 09 36 b0-b6 8f 22 80 4d a0 ff a1   ..L.y.6...".M...
 *       0020 - 34 03 32 00 04 46 c1 7d-10 61 08 39 73 14 45 d0   4.2..F.}.a.9s.E.
 *       0030 - 8d 3b ac 12 05 a5 ef 45-d3 fb 33 cf 91 81 e8 43   .;.....E..3....C
 *       0040 - dd ab cb b7 de 04 64 b0-82 a6 59 27 c9 0d b2 25   ......d...Y'...%
 *       0050 - 32 20 c0 d6 38                                    2 ..8
 *
 * The above OCTET STRING at byte 27 (in this example) contains the actual key values
 * and is in the following format once decoded.
 *
 *    0:d=0  hl=2 l=  83 cons: SEQUENCE
 *     2:d=1  hl=2 l=   1 prim:  INTEGER           :01
 *     5:d=1  hl=2 l=  24 prim:  OCTET STRING
 *       0000 - 88 9f 26 37 f9 f5 1f da-16 1c b0 4c ce 79 09 36   ..&7.......L.y.6
 *       0010 - b0 b6 8f 22 80 4d a0 ff-                          ...".M..
 *    31:d=1  hl=2 l=  52 cons:  cont [ 1 ]
 *    33:d=2  hl=2 l=  50 prim:   BIT STRING
 *       0000 - 00 04 46 c1 7d 10 61 08-39 73 14 45 d0 8d 3b ac   ..F.}.a.9s.E..;.
 *       0010 - 12 05 a5 ef 45 d3 fb 33-cf 91 81 e8 43 dd ab cb   ....E..3....C...
 *       0020 - b7 de 04 64 b0 82 a6 59-27 c9 0d b2 25 32 20 c0   ...d...Y'...%2 .
 *       0030 - d6 38                                             .8
 *
 * The above OCTET STRING contains the private key BigInteger.
 * The BIT STRING contains the public key ECPoint (x, y) values.
 */
private static Key decodeEcKey(final byte[] bytes) throws IOException {
    final Ecdsa.Private.Builder ecdsa = Ecdsa.Private.builder();
    final DerParser d1 = new DerParser(bytes);
    final Asn1Object d1o1 = d1.readObject().assertType(Asn1Type.SEQUENCE);
    {
        final DerParser d2 = new DerParser(d1o1.getValue());
        final Asn1Object d2o1 = d2.readObject().assertType(Asn1Type.INTEGER);
        final Asn1Object d2o2 = d2.readObject().assertType(Asn1Type.SEQUENCE);
        {
            final DerParser d3 = new DerParser(d2o2.getValue());
            final Asn1Object d3o1 = d3.readObject().assertType(Asn1Type.OBJECT_IDENTIFIER);
            final Asn1Object d3o2 = d3.readObject();
            if (d3o2.isType(Asn1Type.OBJECT_IDENTIFIER)) {
                /*
                     * An OID naming a curve is encoded
                     */
                final Oid oid = d3o2.asOID();
                final Curve curve = Curve.resolve(oid);
                if (curve == null) {
                    throw new UnsupportedCurveException(oid.toString());
                }
                ecdsa.curve(curve);
            } else if (d3o2.isType(Asn1Type.SEQUENCE)) {
                /*
                     * The actual curve parameters are encoded
                     */
                final ECParameterSpec parameterSpec = EcCurveParams.parseSequence(d3o2);
                ecdsa.spec(parameterSpec);
            }
        }
        final Asn1Object d2o3 = d2.readObject().assertType(Asn1Type.OCTET_STRING);
        {
            final DerParser d3 = new DerParser(d2o3.getValue());
            final Asn1Object d3o1 = d3.readObject().assertType(Asn1Type.SEQUENCE);
            {
                final DerParser d4 = new DerParser(d3o1.getValue());
                final Asn1Object d4o1 = d4.readObject().assertType(Asn1Type.INTEGER);
                final Asn1Object d4o2 = d4.readObject().assertType(Asn1Type.OCTET_STRING);
                final Asn1Object d4o3 = d4.readObject();
                if (d4o3 != null && d4o3.isType(Asn1Type.BOOLEAN)) {
                    final DerParser d5 = new DerParser(d4o3.getValue());
                    final Asn1Object d5o1 = d5.readObject().assertType(Asn1Type.BIT_STRING);
                    final byte[] value = Bytes.trim(d5o1.getValue());
                    final ECPoint ecPoint = EcPoints.fromBytes(value);
                    ecdsa.x(ecPoint.getAffineX());
                    ecdsa.y(ecPoint.getAffineY());
                }
                ecdsa.d(new BigInteger(1, Bytes.trim(d4o2.getValue())));
                final Ecdsa.Private build = ecdsa.build();
                final ECPrivateKey privateKey = build.toKey();
                final ECPublicKey publicKey = build.getX() != null && build.getY() != null ? build.toPublic().toKey() : null;
                return new Key(privateKey, publicKey, Key.Type.PRIVATE, EC, Key.Format.PEM);
            }
        }
    }
}
Also used : UnsupportedCurveException(io.churchkey.ec.UnsupportedCurveException) ECPrivateKey(java.security.interfaces.ECPrivateKey) Curve(io.churchkey.ec.Curve) DerParser(io.churchkey.asn1.DerParser) Oid(io.churchkey.asn1.Oid) ECPoint(java.security.spec.ECPoint) Asn1Object(io.churchkey.asn1.Asn1Object) ECPublicKey(java.security.interfaces.ECPublicKey) ECParameterSpec(java.security.spec.ECParameterSpec) BigInteger(java.math.BigInteger) DSAPrivateKey(java.security.interfaces.DSAPrivateKey) Key(io.churchkey.Key) RSAPublicKey(java.security.interfaces.RSAPublicKey) ECPrivateKey(java.security.interfaces.ECPrivateKey) DSAPublicKey(java.security.interfaces.DSAPublicKey) RSAPrivateCrtKey(java.security.interfaces.RSAPrivateCrtKey) ECPublicKey(java.security.interfaces.ECPublicKey)

Aggregations

IOException (java.io.IOException)37 Asn1Object (com.android.hotspot2.asn1.Asn1Object)25 ASN1Object (org.bouncycastle.asn1.ASN1Object)20 ArrayList (java.util.ArrayList)16 Asn1Constructed (com.android.hotspot2.asn1.Asn1Constructed)15 HashMap (java.util.HashMap)15 Asn1Object (io.churchkey.asn1.Asn1Object)13 DerParser (io.churchkey.asn1.DerParser)12 X509Certificate (java.security.cert.X509Certificate)12 Asn1Integer (com.android.hotspot2.asn1.Asn1Integer)10 DERBitString (com.android.org.bouncycastle.asn1.DERBitString)10 DERIA5String (com.android.org.bouncycastle.asn1.DERIA5String)10 DERPrintableString (com.android.org.bouncycastle.asn1.DERPrintableString)10 ByteBuffer (java.nio.ByteBuffer)10 Key (io.churchkey.Key)8 ByteArrayInputStream (java.io.ByteArrayInputStream)7 I18Name (com.android.anqp.I18Name)5 Asn1Oid (com.android.hotspot2.asn1.Asn1Oid)5 Asn1String (com.android.hotspot2.asn1.Asn1String)5 OidMappings (com.android.hotspot2.asn1.OidMappings)5