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

tsec.jws.signature.JWTSig.scala Maven / Gradle / Ivy

The newest version!
package tsec.jws.signature

import java.time.Instant

import cats.effect.Sync
import cats.syntax.all._
import tsec.common._
import tsec.jws.{JWSJWT, JWSSerializer}
import tsec.jwt.JWTClaims
import tsec.jwt.algorithms.JWTSigAlgo
import tsec.signature._
import tsec.signature.jca._

case class JWTSig[A](header: JWSSignedHeader[A], body: JWTClaims, signature: CryptoSignature[A])
    extends JWSJWT[A, CryptoSignature] {
  def toEncodedString(implicit hs: JWSSerializer[JWSSignedHeader[A]]): String =
    hs.toB64URL(header) + "." + JWTClaims.toB64URL(body) + "." + signature.toB64UrlString
}

object JWTSig {

  def signAndBuild[F[_]: Sync, A: JWTSigAlgo](
    body: JWTClaims,
    sigPrivateKey: SigPrivateKey[A]
  )(implicit sigCV: JWSSigCV[F, A]): F[JWTSig[A]] = sigCV.signAndBuild(JWSSignedHeader[A](), body, sigPrivateKey)

  def signAndBuild[F[_]: Sync, A: JWTSigAlgo](
    header: JWSSignedHeader[A],
    body: JWTClaims,
    sigPrivateKey: SigPrivateKey[A]
  )(implicit sigCV: JWSSigCV[F, A]): F[JWTSig[A]] = sigCV.signAndBuild(header, body, sigPrivateKey)

  def signToString[F[_]: Sync, A: JWTSigAlgo](
    body: JWTClaims,
    sigPrivateKey: SigPrivateKey[A]
  )(implicit sigCV: JWSSigCV[F, A]): F[String] = sigCV.signToString(JWSSignedHeader[A](), body, sigPrivateKey)

  def signToString[F[_]: Sync, A: JWTSigAlgo](
    header: JWSSignedHeader[A],
    body: JWTClaims,
    sigPrivateKey: SigPrivateKey[A]
  )(implicit sigCV: JWSSigCV[F, A]): F[String] = sigCV.signToString(header, body, sigPrivateKey)

  def verifyK[F[_], A: JWTSigAlgo](
    jwt: String,
    pubKey: SigPublicKey[A]
  )(implicit F: Sync[F], sigCV: JWSSigCV[F, A]): F[JWTSig[A]] =
    F.delay(Instant.now()).flatMap(sigCV.verify(jwt, pubKey, _))

  def verifyC[F[_], A: JWTSigAlgo](
    jwt: String,
    cert: SigCertificate[A]
  )(implicit F: Sync[F], sigCV: JWSSigCV[F, A]): F[JWTSig[A]] =
    F.delay(Instant.now()).flatMap(sigCV.verifyCert(jwt, cert, _))

  def verifyKI[F[_], A: JWTSigAlgo](
    jwt: JWTSig[A],
    extract: SigPublicKey[A]
  )(implicit F: Sync[F], sigCV: JWSSigCV[F, A], hs: JWSSerializer[JWSSignedHeader[A]]): F[JWTSig[A]] =
    verifyK[F, A](jwt.toEncodedString, extract)

  def verifyCI[F[_], A: JWTSigAlgo](
    jwt: JWTSig[A],
    extract: SigCertificate[A]
  )(implicit F: Sync[F], sigCV: JWSSigCV[F, A], hs: JWSSerializer[JWSSignedHeader[A]]): F[JWTSig[A]] =
    verifyC[F, A](jwt.toEncodedString, extract)

}

object JWTSigImpure {

  def signAndBuild[A: JWTSigAlgo](body: JWTClaims, sigPrivateKey: SigPrivateKey[A])(
      implicit sigCV: JWSSigCV[SigErrorM, A]
  ): SigErrorM[JWTSig[A]] = sigCV.signAndBuild(JWSSignedHeader[A](), body, sigPrivateKey)

  def signAndBuild[A: JWTSigAlgo](header: JWSSignedHeader[A], body: JWTClaims, sigPrivateKey: SigPrivateKey[A])(
      implicit sigCV: JWSSigCV[SigErrorM, A]
  ): SigErrorM[JWTSig[A]] = sigCV.signAndBuild(header, body, sigPrivateKey)

  def signToString[A: JWTSigAlgo](header: JWSSignedHeader[A], body: JWTClaims, sigPrivateKey: SigPrivateKey[A])(
      implicit sigCV: JWSSigCV[SigErrorM, A]
  ): SigErrorM[String] = sigCV.signToString(header, body, sigPrivateKey)

  def signToString[A: JWTSigAlgo](body: JWTClaims, sigPrivateKey: SigPrivateKey[A])(
      implicit sigCV: JWSSigCV[SigErrorM, A]
  ): SigErrorM[String] = sigCV.signToString(JWSSignedHeader[A](), body, sigPrivateKey)

  def verifyK[A: JWTSigAlgo](
      jwt: String,
      pubKey: SigPublicKey[A]
  )(implicit sigCV: JWSSigCV[SigErrorM, A]): SigErrorM[JWTSig[A]] = sigCV.verify(jwt, pubKey, Instant.now())

  def verifyC[A: JWTSigAlgo](
      jwt: String,
      cert: SigCertificate[A]
  )(implicit sigCV: JWSSigCV[SigErrorM, A]): SigErrorM[JWTSig[A]] = sigCV.verifyCert(jwt, cert, Instant.now())

  def verifyKI[A: JWTSigAlgo](
      jwt: JWTSig[A],
      extract: SigPublicKey[A]
  )(implicit sigCV: JWSSigCV[SigErrorM, A], hs: JWSSerializer[JWSSignedHeader[A]]): SigErrorM[JWTSig[A]] =
    verifyK[A](jwt.toEncodedString, extract)

  def verifyCI[A: JWTSigAlgo](
      jwt: JWTSig[A],
      cert: SigCertificate[A]
  )(implicit sigCV: JWSSigCV[SigErrorM, A]): SigErrorM[JWTSig[A]] =
    sigCV.verifyCert(jwt.toEncodedString, cert, Instant.now())

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy