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

com.jsuereth.pgp.KeyGen.scala Maven / Gradle / Ivy

The newest version!
package com.jsuereth.pgp

import org.bouncycastle._
import java.math.BigInteger
import java.security.{SecureRandom,Security,KeyPairGenerator,KeyPair}
import java.util.Date

import org.bouncycastle.bcpg._
import org.bouncycastle.jce.provider.BouncyCastleProvider
import org.bouncycastle.jce.spec.ElGamalParameterSpec
import org.bouncycastle.openpgp._

/** Helpers to generate various keys. */
object KeyGen {
  /** Constructs a new RSA PGPKeyPair (for encryption/signing) */
  def makeRsaKeyPair(bitStrength: Int = 2048): PGPKeyPair = {
    val rsa = {
      val generator = KeyPairGenerator.getInstance("RSA", "BC")
      generator.initialize(bitStrength)
      generator.generateKeyPair()
    }
    new PGPKeyPair(PublicKeyAlgorithmTags.RSA_GENERAL, rsa, new Date())    
  }
  /** Constructs a new DSA PGP Pair. (only useful for signing) */
  def makeDsaKeyPair(bitStrength: Int = 2048): PGPKeyPair = {
    val dsa = {
      val generator = KeyPairGenerator.getInstance("DSA", "BC")
      generator.initialize(bitStrength)
      generator.generateKeyPair()
    }
    new PGPKeyPair(PublicKeyAlgorithmTags.DSA, dsa, new Date())
  }
  /** Make a new El Gamal key for signing/encrypting things. */
  def makeElGamalKeyPair(params: Option[ElGamalParameterSpec] = None,
                         encryptOnly: Boolean = false): PGPKeyPair = {
    val elg = {
      val generator = KeyPairGenerator.getInstance("ELGAMAL", "BC")
      params foreach generator.initialize
      generator.generateKeyPair()
    }
    if(encryptOnly) new PGPKeyPair(PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT, elg, new Date())
    else new PGPKeyPair(PublicKeyAlgorithmTags.ELGAMAL_GENERAL, elg, new Date())
  }
  
  /** Makes a new PGP Key ring generator, fully configured with reasonable defaults. */
  def makePgpKeyRingGenerator(
      identity: String, 
      passPhrase: Array[Char], 
      keyPair: PGPKeyPair,
      subKeyPairs: PGPKeyPair*): PGPKeyRingGenerator = {
    val keyRingGen = new PGPKeyRingGenerator(
        PGPSignature.POSITIVE_CERTIFICATION,
        keyPair,
        identity,
        SymmetricKeyAlgorithmTags.CAST5,
        passPhrase,
        true,
        null,
        null,
        new SecureRandom(),
        "BC")
    subKeyPairs foreach keyRingGen.addSubKey
    keyRingGen
  }
  
  /** Instantiates a KeyRingGenerator for combined DSA/ElGamal keys */
  def makeDsaKeyRingGenerator(identity: String, passPhrase: Array[Char]): PGPKeyRingGenerator =
    makePgpKeyRingGenerator(
        identity, 
        passPhrase,
        makeDsaKeyPair(),
        makeElGamalKeyPair(encryptOnly=true))
        
  /** Instantiates a KeyRingGenerator for RSA keys */
  def makeRsaKeyRingGenerator(identity: String, passPhrase: Array[Char]): PGPKeyRingGenerator =
    makePgpKeyRingGenerator(
        identity, 
        passPhrase,
        makeRsaKeyPair())  

  /** Instantiates a KeyRingGenerator for El Gamal keys */
  def makeElGamalKeyRingGenerator(identity: String, passPhrase: Array[Char]): PGPKeyRingGenerator =
    makePgpKeyRingGenerator(
        identity, 
        passPhrase,
        makeElGamalKeyPair())
  
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy