All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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