
com.wanari.webpush.Utils.scala Maven / Gradle / Ivy
The newest version!
package com.wanari.webpush
import java.security.KeyFactory
import java.security.interfaces.{ECPrivateKey, ECPublicKey}
import java.util.Base64
import org.apache.commons.codec.binary.Hex.decodeHex
import org.bouncycastle.jce.ECNamedCurveTable
import org.bouncycastle.jce.provider.BouncyCastleProvider
import org.bouncycastle.jce.spec.{ECNamedCurveParameterSpec, ECPrivateKeySpec, ECPublicKeySpec}
import org.bouncycastle.util.BigIntegers
object Utils {
def savePrivateKey(privateKey: ECPrivateKey): Array[Byte] = privateKey.getS.toByteArray
def base64Decode(base64Encoded: String): Array[Byte] = {
if (base64Encoded.contains("+") || base64Encoded.contains("/")) Base64.getDecoder.decode(base64Encoded)
else Base64.getUrlDecoder.decode(base64Encoded)
}
def loadPublicKey(encodedPublicKey: String): ECPublicKey = {
val ecSpec: ECNamedCurveParameterSpec = ECNamedCurveTable.getParameterSpec("prime256v1")
KeyFactory
.getInstance("ECDH", BouncyCastleProvider.PROVIDER_NAME)
.generatePublic(new ECPublicKeySpec(ecSpec.getCurve.decodePoint(base64Decode(encodedPublicKey)), ecSpec))
.asInstanceOf[ECPublicKey]
}
def loadPrivateKey(encodedPrivateKey: String): ECPrivateKey = {
KeyFactory
.getInstance("ECDH", BouncyCastleProvider.PROVIDER_NAME)
.generatePrivate(
new ECPrivateKeySpec(BigIntegers.fromUnsignedByteArray(base64Decode(encodedPrivateKey)), ECNamedCurveTable.getParameterSpec("prime256v1")),
)
.asInstanceOf[ECPrivateKey]
}
def toJsonString(json: Map[String, String]): String = {
json.map { case (k, v) => s""""$k":"$v"""" }.mkString("{", ",", "}")
}
def publicKeyToBytes(publicKey: ECPublicKey): Array[Byte] = {
val point = publicKey.getW
val x = point.getAffineX.toString(16)
val y = point.getAffineY.toString(16)
val sb = new StringBuilder()
sb.append("04")
(1 to (64 - x.length)).foreach(_ => sb.append(0))
sb.append(x)
(1 to (64 - y.length)).foreach(_ => sb.append(0))
sb.append(y)
decodeHex(sb.toString.toCharArray)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy