535 lines
14 KiB
Text
535 lines
14 KiB
Text
<!-----------------------------------------------------------------------------
|
|
|
|
Component Name: Cryptography.
|
|
Description: This component handles all the functionalities
|
|
related to cryptography.
|
|
|
|
Author: Mindfire Solutions (contracted by Brian Ghidinelli)
|
|
Create Date: 25th June 2007
|
|
Copyright: Copyright (c) 2007 Brian Ghidinelli (http://www.ghidinelli.com)
|
|
|
|
------------------------------------------------------------------------------>
|
|
<cfcomponent name="cryptoService"
|
|
displayname="Cryptography Component"
|
|
hint="I contain all functionalities related to cryptography">
|
|
|
|
<!---------------------------------------------------------------------------
|
|
|
|
Name: init
|
|
|
|
Arguments:
|
|
1. keyStoreFile [ Type:String Required:Yes ]
|
|
- The keystore filename with physical path which is to be initialized
|
|
|
|
Returns:
|
|
Nothing.
|
|
|
|
Description:
|
|
Initializes a specified keystore file. Creates a new one, if specified
|
|
keystore file is not present and initializes to the new keystore.
|
|
|
|
---------------------------------------------------------------------------->
|
|
<cffunction name="init"
|
|
access="public"
|
|
displayname="Init Key Store"
|
|
returntype="void"
|
|
output="false">
|
|
<cfargument name="keyStoreFile"
|
|
displayname="Key Store File "
|
|
type="string"
|
|
required="yes">
|
|
<cfargument name="passPhrase"
|
|
displayname="Pass Phrase "
|
|
type="string"
|
|
required="no">
|
|
|
|
|
|
<!--- Initialization of local variables. --->
|
|
<cfset var objCrypto = 0>
|
|
|
|
<!--- Create the java object and initialize by calling its constructor. --->
|
|
<cfset objCrypto = CreateObject("java", "java.Cryptography")>
|
|
<cfset objCrypto.Init()>
|
|
|
|
<cftry>
|
|
|
|
<cfif not FileExists(keyStoreFile) and Len(passPhrase) eq 0>
|
|
|
|
<cfset displayError("Invalid Arguments","Password is not provided and KeyStore doesn't exist")>
|
|
|
|
<cfelseif not FileExists(keyStoreFile) and Len(passPhrase) gt 0>
|
|
|
|
<cfset objCrypto.keyStoreGenerator(keyStoreFile,passPhrase )>
|
|
<cfset objCrypto.Init(keyStoreFile)>
|
|
|
|
<cfelse>
|
|
|
|
<cfset objCrypto.Init(keyStoreFile)>
|
|
|
|
</cfif>
|
|
|
|
<cfcatch type="any">
|
|
<cfset displayError(cfcatch.Type,cfcatch.Message)>
|
|
</cfcatch>
|
|
|
|
</cftry>
|
|
|
|
<cfset variables.objCrypto = objCrypto>
|
|
|
|
</cffunction>
|
|
|
|
<!---------------------------------------------------------------------------
|
|
|
|
Name: encryptData
|
|
|
|
Arguments:
|
|
1. data [ Type:String Required:Yes ]
|
|
- Data to be encrypted.
|
|
|
|
2. publicKey [ Type:Struct Required:Yes ]
|
|
- Structure containing public key data to be used for encryption.
|
|
|
|
|
|
Returns:
|
|
The encrypted Data.
|
|
[ Type:String ]
|
|
|
|
Description:
|
|
Encrypts the specified data using the specified public key.
|
|
|
|
---------------------------------------------------------------------------->
|
|
<cffunction name="encryptData"
|
|
access="public"
|
|
displayname="Encrypt Data"
|
|
returntype="string"
|
|
output="false">
|
|
<cfargument name="data"
|
|
displayname="Data"
|
|
type="string"
|
|
required="yes">
|
|
<cfargument name="publicKey"
|
|
displayname="Public Key"
|
|
type="struct"
|
|
required="yes">
|
|
|
|
|
|
<!--- Initialization of local variables. --->
|
|
<cfset var encString = "">
|
|
|
|
<cftry>
|
|
|
|
<cfset encString = variables.objCrypto.encryption(data, publicKey.modulus, publicKey.exponent)>
|
|
<cfcatch type="any" >
|
|
<cfset displayError(cfcatch.Type,cfcatch.Message)>
|
|
</cfcatch>
|
|
|
|
</cftry>
|
|
|
|
<cfreturn encString>
|
|
|
|
</cffunction>
|
|
|
|
<!---------------------------------------------------------------------------
|
|
|
|
Name: decryptData
|
|
|
|
Arguments:
|
|
1. data [ Type:String Required:Yes ]
|
|
- Data to be decrypted.
|
|
|
|
2. privateKey [ Type:Struct Required:Yes ]
|
|
- Structure containing private key data to be used for decryption.
|
|
|
|
Returns:
|
|
The decrypted Data.
|
|
[ Type:String ]
|
|
|
|
Description:
|
|
Decrypts the specified data using the specified private key.
|
|
|
|
---------------------------------------------------------------------------->
|
|
<cffunction name="decryptData"
|
|
access="public"
|
|
displayname="Decrypt Data"
|
|
returntype="String"
|
|
output="false">
|
|
<cfargument name="data"
|
|
displayname="Data"
|
|
type="string"
|
|
required="yes">
|
|
<cfargument name="privateKey"
|
|
displayname="Private Key"
|
|
type="struct"
|
|
required="yes">
|
|
|
|
|
|
<!--- Initialization of local variables. --->
|
|
<cfset var decString = "">
|
|
|
|
<cftry>
|
|
|
|
<cfset decString = variables.objCrypto.decryption(data, privateKey.modulus,
|
|
privateKey.privExponent, privateKey.pubExponent, privateKey.primeP,
|
|
privateKey.primeQ, privateKey.primeexponentP,
|
|
privateKey.primeExponentQ, privateKey.crtCoefficient)>
|
|
|
|
<cfcatch type="any" >
|
|
<cfset displayError(cfcatch.Type,cfcatch.Message)>
|
|
</cfcatch>
|
|
|
|
</cftry>
|
|
|
|
<cfreturn decString>
|
|
|
|
</cffunction>
|
|
|
|
<!---------------------------------------------------------------------------
|
|
|
|
Name: importKey
|
|
|
|
Arguments:
|
|
1. key [ Type:Structure Required:Yes ]
|
|
- key which will be added in the KeyStore.It can be Public Key or Private Key .
|
|
|
|
2. passPhrase [ Type:String Required:Yes ]
|
|
- Password of the keystore where key is to be imported.
|
|
|
|
3. alias [ Type:String Required:Yes ]
|
|
- Alias name for the key to be imported.
|
|
|
|
Returns:
|
|
Noting
|
|
[ Type:Void ]
|
|
|
|
Description:
|
|
Add a key from specified keyfile to the keystore with the specified
|
|
alias and password.
|
|
|
|
---------------------------------------------------------------------------->
|
|
<cffunction name="importKey"
|
|
access="public"
|
|
displayname="Import Key"
|
|
returntype="Void"
|
|
output="false">
|
|
<cfargument name="key"
|
|
displayname="Key"
|
|
type="struct"
|
|
required="yes">
|
|
<cfargument name="alias"
|
|
displayname="Alias"
|
|
type="string"
|
|
required="yes">
|
|
<cfargument name="passPhrase"
|
|
displayname="Pass Phrase"
|
|
type="string"
|
|
required="yes">
|
|
|
|
|
|
<cftry>
|
|
|
|
<cfif StructCount(key) GT 2>
|
|
<cfset variables.objCrypto.importKey(alias, passPhrase, key.modulus,
|
|
key.privExponent, key.pubExponent, key.primeP, key.primeQ,
|
|
key.primeExponentP, key.primeExponentQ, key.crtCoefficient)>
|
|
|
|
<cfelse>
|
|
|
|
<cfset variables.objCrypto.importKey
|
|
(alias, passPhrase, key.modulus, key.exponent)>
|
|
|
|
</cfif>
|
|
|
|
<cfcatch type="any" >
|
|
<cfset displayError(cfcatch.Type,cfcatch.Message)>
|
|
</cfcatch>
|
|
|
|
</cftry>
|
|
|
|
</cffunction>
|
|
|
|
<!---------------------------------------------------------------------------
|
|
|
|
Name: deleteKey
|
|
|
|
Arguments:
|
|
1. alias [ Type:String Required:Yes ]
|
|
- Alias name of the key to be deleted.
|
|
|
|
2. passPhrase [ Type:String Required:Yes ]
|
|
- Password of the keystore from which key is to be deleted.
|
|
|
|
Returns:
|
|
Noting
|
|
[ Type:Void ]
|
|
|
|
Description:
|
|
Deletes a key with the specified alias name.
|
|
|
|
---------------------------------------------------------------------------->
|
|
<cffunction name="deleteKey"
|
|
access="public"
|
|
displayname="Delete Key"
|
|
returntype="Void"
|
|
output="false">
|
|
<cfargument name="alias"
|
|
displayname="Alias"
|
|
type="string"
|
|
required="yes">
|
|
<cfargument name="passPhrase"
|
|
displayname="Pass Phrase"
|
|
type="string"
|
|
required="yes">
|
|
|
|
<cftry>
|
|
|
|
<cfset variables.objCrypto.deleteKey(alias,passPhrase)>
|
|
|
|
<cfcatch type="any">
|
|
<cfset displayError(cfcatch.Type,cfcatch.Message)>
|
|
</cfcatch>
|
|
|
|
</cftry>
|
|
|
|
</cffunction>
|
|
|
|
<!---------------------------------------------------------------------------
|
|
|
|
Name: listKeys
|
|
|
|
Arguments:
|
|
1. passPhrase [ Type:String Required:Yes ]
|
|
- Password of the keystore from which key aliases are to be listed.
|
|
|
|
Returns:
|
|
A an array containing a list of key aliases.
|
|
[ Type:Array ]
|
|
|
|
Description:
|
|
Lists all key aliases from the keystore.
|
|
|
|
---------------------------------------------------------------------------->
|
|
<cffunction name="listKeys"
|
|
access="public"
|
|
displayname="Init Key Store"
|
|
returntype="array"
|
|
output="false">
|
|
|
|
<cfargument name="passPhrase"
|
|
displayname="Pass Phrase"
|
|
type="string"
|
|
required="yes">
|
|
|
|
|
|
<!--- Initialization of local variables. --->
|
|
<cfset var keyArray = ArrayNew(1)>
|
|
|
|
<cftry>
|
|
|
|
<cfset keyArray = variables.objCrypto.listKeys(passPhrase)>
|
|
<cfcatch>
|
|
<cfset displayError(cfcatch.Type,cfcatch.Message)>
|
|
</cfcatch>
|
|
|
|
</cftry>
|
|
|
|
<cfreturn keyArray>
|
|
|
|
</cffunction>
|
|
|
|
<!---------------------------------------------------------------------------
|
|
|
|
Name: getKey
|
|
|
|
Arguments:
|
|
1. alias [ Type:String Required:Yes ]
|
|
- Alias name of the key to be retrieved.
|
|
|
|
2. passPhrase [ Type:String Required:Yes ]
|
|
- Password of the keystore from which key will be retrieved.
|
|
|
|
Returns:
|
|
The key related to the specified alias name.
|
|
[ Type:Structure ]
|
|
|
|
Description:
|
|
Gets the key of the specified alias name.
|
|
|
|
---------------------------------------------------------------------------->
|
|
<cffunction name="getKey"
|
|
access="public"
|
|
displayname="Get Key"
|
|
returntype="struct"
|
|
output="false">
|
|
<cfargument name="alias"
|
|
displayname="Alias"
|
|
type="string"
|
|
required="yes">
|
|
<cfargument name="passPhrase"
|
|
displayname="Pass Phrase"
|
|
type="string"
|
|
required="yes">
|
|
|
|
|
|
<!--- Initialization of local variables. --->
|
|
<cfset var retKey = "" />
|
|
<cfset var isPublicKey = 0 />
|
|
<cfset var Key = StructNew() />
|
|
|
|
<cftry>
|
|
|
|
<cfset retKey = variables.objCrypto.retrieveKey(alias,passPhrase)>
|
|
<cfset isPublicKey = Find("RSAPublicKey",retKey.getClass().toString())>
|
|
|
|
<cfif isPublicKey EQ "0">
|
|
<!--- Create a Private Key Structure --->
|
|
<cfset Key.modulus = retKey.getModulus().toString()>
|
|
<cfset Key.privExponent = retKey.getPrivateExponent().toString()>
|
|
<cfset Key.pubExponent = retKey.getPublicExponent().toString()>
|
|
<cfset Key.primeP = retKey.getPrimeP().toString()>
|
|
<cfset Key.primeQ = retKey.getPrimeQ().toString()>
|
|
<cfset Key.primeExponentP = retKey.getPrimeExponentP().toString()>
|
|
<cfset Key.primeExponentQ = retKey.getPrimeExponentQ().toString()>
|
|
<cfset Key.crtCoefficient = retKey.getCrtCoefficient().toString()>
|
|
|
|
<cfelse>
|
|
<!--- Create a Public Key Structure --->
|
|
<cfset Key = StructNew()>
|
|
<cfset Key.modulus = retKey.getModulus().toString()>
|
|
<cfset Key.exponent = retKey.getPublicExponent().toString()>
|
|
|
|
</cfif>
|
|
|
|
<cfcatch type="any" >
|
|
<cfset displayError(cfcatch.Type,cfcatch.Message)>
|
|
</cfcatch>
|
|
|
|
</cftry>
|
|
|
|
<cfreturn Key>
|
|
|
|
</cffunction>
|
|
|
|
<!---------------------------------------------------------------------------
|
|
|
|
Name: generateKeyPair
|
|
|
|
Arguments:
|
|
1. keySize [ Type:Integer Required:Yes ]
|
|
- Size of the keyPair to be generated.
|
|
|
|
Returns:
|
|
A structure containing a key pair of private key and public key.
|
|
[ Type:Struct ]
|
|
|
|
Description:
|
|
Generate a keypair having public key and private key.
|
|
|
|
---------------------------------------------------------------------------->
|
|
<cffunction name="generateKeyPair"
|
|
access="public"
|
|
displayname="Generate Key Pair"
|
|
returntype="struct"
|
|
output="false">
|
|
<cfargument name="keySize"
|
|
displayname="Key Size"
|
|
type="numeric"
|
|
required="yes">
|
|
|
|
|
|
<!--- Initialization of local variables. --->
|
|
<cfset var keyPair = StructNew()>
|
|
<cfset var key = 0>
|
|
|
|
<cfif arguments.keySize gt 2048>
|
|
<cfset displayError("KeySize Exception","KeySize exceeded than 2048 bits")>
|
|
<cfelseif arguments.keySize lt 0>
|
|
<cfset displayError("KeySize Exception","KeySize cannot be negative.")>
|
|
<cfelse>
|
|
|
|
<cftry>
|
|
|
|
<cfset key = variables.objCrypto.keyPairGeneration(arguments.keySize)>
|
|
<cfset keyPair.publicKey = StructNew()>
|
|
<cfset keyPair.publicKey.modulus = key.getPublic().getModulus().toString()>
|
|
<cfset keyPair.publicKey.exponent = key.getPublic().getExponent().toString()>
|
|
|
|
<cfset keyPair.privateKey = StructNew()>
|
|
<cfset keyPair.privateKey.modulus = key.getPrivate().getModulus().toString()>
|
|
<cfset keyPair.privateKey.privExponent = key.getPrivate().getExponent().toString()>
|
|
<cfset keyPair.privateKey.pubExponent = key.getPrivate().getPublicExponent().toString()>
|
|
<cfset keyPair.privateKey.primeExponentP = key.getPrivate().getDP().toString()>
|
|
<cfset keyPair.privateKey.primeExponentQ = key.getPrivate().getDQ().toString()>
|
|
<cfset keyPair.privateKey.primeP = key.getPrivate().getP().toString()>
|
|
<cfset keyPair.privateKey.primeQ = key.getPrivate().getQ().toString()>
|
|
<cfset keyPair.privateKey.crtCoefficient = key.getPrivate().getQInv().toString()>
|
|
|
|
<cfcatch type="any">
|
|
<cfset displayError(cfcatch.Type,cfcatch.Message)>
|
|
</cfcatch>
|
|
|
|
</cftry>
|
|
|
|
</cfif>
|
|
|
|
<cfreturn keyPair>
|
|
|
|
</cffunction>
|
|
|
|
<!---------------------------------------------------------------------------
|
|
|
|
Name: displayError
|
|
|
|
Arguments:
|
|
1. errorType [ Type:String Required:Yes ]
|
|
- Type of exception to be generated.
|
|
2. errorMessage [Type:String Required:Yes]
|
|
- Message for the exception
|
|
|
|
Returns:
|
|
A string containing a type of exception and details about the exception.
|
|
[ Type:String ]
|
|
|
|
Description:
|
|
Display exception of particular type and corresponding message.
|
|
|
|
---------------------------------------------------------------------------->
|
|
<cffunction name="displayError"
|
|
access="public"
|
|
displayname="Display Error"
|
|
returntype="struct"
|
|
output="true">
|
|
<cfargument name="errorType"
|
|
displayname="Error Type"
|
|
type="string"
|
|
required="yes">
|
|
<cfargument name="errorMessage"
|
|
displayname="Error Message"
|
|
type="string"
|
|
required="yes">
|
|
|
|
<cfoutput>
|
|
|
|
<table cellpadding="2" style="font-family:Verdana;width:80%;color:##666666;
|
|
border-top:##CCCCCC solid 1px;
|
|
border-bottom:##999999 solid 1px;
|
|
border-right:##CCCCCC solid 1px;
|
|
border-left:##999999 solid 1px;">
|
|
<tr style="background-color:##cccccc;font-size:16px;">
|
|
<td colspan="2"><b>Error</b>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="font-size:14px;">Type:</td>
|
|
<td style="font-size:12px;">#errorType#</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="font-size:14px;">Message:</td>
|
|
<td style="font-size:12px;">#errorMessage#</td>
|
|
</tr>
|
|
</table>
|
|
</cfoutput>
|
|
<cfabort>
|
|
|
|
</cffunction>
|
|
|
|
</cfcomponent>
|