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());
}
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);
}
}
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);
}
}
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();
}
}
}
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);
}
}
}
}
Aggregations