- ByteArrayOutputStream byteOs = new ByteArrayOutputStream();
- if (publicKey instanceof RSAPublicKey rsa) {
- DataOutputStream dout = new DataOutputStream(byteOs);
- dout.writeInt(KEY_TYPE_RSA.getBytes(StandardCharsets.UTF_8).length);
- dout.write(KEY_TYPE_RSA.getBytes(StandardCharsets.UTF_8));
- dout.writeInt(rsa.getPublicExponent().toByteArray().length);
- dout.write(rsa.getPublicExponent().toByteArray());
- dout.writeInt(rsa.getModulus().toByteArray().length);
- dout.write(rsa.getModulus().toByteArray());
- } else if (publicKey instanceof DSAPublicKey dsa) {
- DSAParams dsaParams = dsa.getParams();
- DataOutputStream dout = new DataOutputStream(byteOs);
- dout.writeInt(KEY_TYPE_DSA.getBytes(StandardCharsets.UTF_8).length);
- dout.write(KEY_TYPE_DSA.getBytes(StandardCharsets.UTF_8));
- dout.writeInt(dsaParams.getP().toByteArray().length);
- dout.write(dsaParams.getP().toByteArray());
- dout.writeInt(dsaParams.getQ().toByteArray().length);
- dout.write(dsaParams.getQ().toByteArray());
- dout.writeInt(dsaParams.getG().toByteArray().length);
- dout.write(dsaParams.getG().toByteArray());
- dout.writeInt(dsa.getY().toByteArray().length);
- dout.write(dsa.getY().toByteArray());
- } else if (publicKey instanceof ECPublicKey ec) {
- DataOutputStream dout = new DataOutputStream(byteOs);
- dout.writeInt(KEY_TYPE_ECDSA.getBytes(StandardCharsets.UTF_8).length);
- dout.write(KEY_TYPE_ECDSA.getBytes(StandardCharsets.UTF_8));
- dout.writeInt(ECDSA_SUPPORTED_CURVE_NAME.getBytes(StandardCharsets.UTF_8).length);
- dout.write(ECDSA_SUPPORTED_CURVE_NAME.getBytes(StandardCharsets.UTF_8));
-
- byte[] coordX = ec.getQ().getAffineXCoord().getEncoded();
- byte[] coordY = ec.getQ().getAffineYCoord().getEncoded();
- dout.writeInt(coordX.length + coordY.length + 1);
- dout.writeByte(0x04);
- dout.write(coordX);
- dout.write(coordY);
- } else {
- throw new IllegalArgumentException("Unknown public key encoding: " + publicKey);
+ final var baos = new ByteArrayOutputStream();
+
+ try (var dout = new DataOutputStream(baos)) {
+ if (publicKey instanceof RSAPublicKey rsa) {
+ dout.writeInt(KEY_TYPE_RSA_BYTES.length);
+ dout.write(KEY_TYPE_RSA_BYTES);
+ encodeBigInt(dout, rsa.getPublicExponent());
+ encodeBigInt(dout, rsa.getModulus());
+ } else if (publicKey instanceof DSAPublicKey dsa) {
+ final var dsaParams = dsa.getParams();
+ dout.writeInt(KEY_TYPE_DSA_BYTES.length);
+ dout.write(KEY_TYPE_DSA_BYTES);
+ encodeBigInt(dout, dsaParams.getP());
+ encodeBigInt(dout, dsaParams.getQ());
+ encodeBigInt(dout, dsaParams.getG());
+ encodeBigInt(dout, dsa.getY());
+ } else if (publicKey instanceof ECPublicKey ec) {
+ dout.writeInt(KEY_TYPE_ECDSA_BYTES.length);
+ dout.write(KEY_TYPE_ECDSA_BYTES);
+ dout.writeInt(ECDSA_SUPPORTED_CURVE_NAME_BYTES.length);
+ dout.write(ECDSA_SUPPORTED_CURVE_NAME_BYTES);
+
+ final var q = ec.getQ();
+ final var coordX = q.getAffineXCoord().getEncoded();
+ final var coordY = q.getAffineYCoord().getEncoded();
+ dout.writeInt(coordX.length + coordY.length + 1);
+ dout.writeByte(0x04);
+ dout.write(coordX);
+ dout.write(coordY);
+ } else {
+ throw new IllegalArgumentException("Unknown public key encoding: " + publicKey);
+ }