To generate x_fp_hash using C please see the code below:
#include <openssl/hmac.h>
#include <stdio.h>
int main() {
const char key[] = "V0WX5fK~o6eEhr7hbs3ZeyxS";
unsigned char result[EVP_MAX_MD_SIZE], hex_result[EVP_MAX_MD_SIZE*2];
char* p;
unsigned char data[100];
unsigned int datalen, resultlen, i;
HMAC_CTX ctx;
// HMAC MD5
// HMAC_Init(&ctx, key, sizeof(key), EVP_md5());
// HMAC SHA1
HMAC_Init(&ctx, key, sizeof(key), EVP_sha1());
// x_login^x_fp_sequence^x_fp_timestamp^x_amount^x_currency
datalen = sprintf((char *)data, "%s^%s^%s^%s^%s", "WSP-ACTIV-70", "123", "1228774539", "100.00", "");
HMAC_Update(&ctx, data, datalen);
HMAC_Final(&ctx, result, &resultlen);
p = (char *)hex_result;
for(i=0; i < resultlen; i++) {
p += sprintf(p, "%02x", result[i]);
}
p = '\0';
printf("The hmac hash is %s\n", hex_result);
HMAC_cleanup(&ctx);
return 0;
}
To generate x_fp_hash using C# please see the code below:
using System;
using System.Security;
using System.Security.Cryptography;
using System.Text;
class CalculateHash {
static void Main() {
StringBuilder sb = new StringBuilder();
// x_login^x_fp_sequence^x_fp_timestamp^x_amount^x_currency
String x_login = "WSP-ACTIV-70";
String x_fp_sequence = "123";
String x_fp_timestamp = "1228774539";
String x_amount = "100.00";
String x_currency = ""; // default empty
sb.Append(x_login)
.Append("^")
.Append(x_fp_sequence)
.Append("^")
.Append(x_fp_timestamp)
.Append("^")
.Append(x_amount)
.Append("^")
.Append(x_currency);
// Convert string to array of bytes.
byte[] data = Encoding.UTF8.GetBytes(sb.ToString());
// key
byte[] key = Encoding.UTF8.GetBytes("V0WX5fK~o6eEhr7hbs3ZeyxS");
// Create HMAC-MD5 Algorithm;
// HMACMD5 hmac = new HMACMD5(key);
// Create HMAC-SHA1 Algorithm;
HMACSHA1 hmac = new HMACSHA1(key);
// Compute hash.
byte[] hashBytes = hmac.ComputeHash(data);
// Convert to HEX string.
String x_fp_hash = System.BitConverter.ToString(hashBytes).Replace("-", "");
String msg = String.Format("x_login = {0}, x_fp_sequence = {1}, x_fp_timestamp = {2}, x_amount = {3}, x_currency= {4}.\n x_fp_hash = {5}", x_login, x_fp_sequence, x_fp_timestamp, x_amount, x_currency, x_fp_hash);
System.Console.WriteLine(msg);
}
}
To generate x_fp_hash using Python please see the code below:
import hmac
import hashlib
# Instantiate hmac with Transaction key (HMAC-MD5)
# digest_maker = hmac.new('V0WX5fK~o6eEhr7hbs3ZeyxS', '', hashlib.md5)
# Instantiate hmac with Transaction key (HMAC-SHA1)
digest_maker = hmac.new('V0WX5fK~o6eEhr7hbs3ZeyxS', '', hashlib.sha1)
format = '%(x_login)s^%(x_fp_sequence)s^%(x_fp_timestamp)s^%(x_amount)s^%(x_currency)s'
data = format % {'x_login' : 'WSP-ACTIV-70',
'x_fp_sequence' : '123',
'x_fp_timestamp' : '1228774539',
'x_amount' : '100.00',
'x_currency' : ''}
digest_maker.update(data)
x_fp_hash = digest_maker.hexdigest()
print x_fp_hash
To generate x_fp_hash using Ocaml please see the code below:
(* Requres Ocaml Cryptokit http://caml.inria.fr/distrib/bazar-ocaml/cryptokit-1.3.tar.gz *)
(* then invoke as 'ocaml unix.cma nums.cma cryptokit.cma calculate_hash.ml' *)
open Printf;;
open Cryptokit;;
(* HMAC MD5
let calculate_hash hmac_key hmac_data =
(transform_string (Hexa.encode()) (hash_string (MAC.hmac_md5 hmac_key) hmac_data));;
*)
(* HMAC SHA1 *)
let calculate_hash hmac_key hmac_data =
(transform_string (Hexa.encode()) (hash_string (MAC.hmac_sha1 hmac_key) hmac_data));;
(* HMAC Key *)
let key = "V0WX5fK~o6eEhr7hbs3ZeyxS";;
let data = Printf.sprintf "%s^%s^%s^%s^%s" "WSP-ACTIV-70" "123" "1228774539" "100.00" "";;
Printf.printf "The data to hash is: %s\n" data;;
Printf.printf "The hash is: %s\n" (calculate_hash key data);;
To generate x_fp_hash using ColdFusion please see the code below:
<!---
Coldfusion sample for HMAC-MD5 or HMAC-SHA1 hash generation.
The hash obtained and the payment data are used in the POST form (not shown here - see Payment Pages Integration Manual for details).
This is Verified on ColdFusion 8, Developer Edition, on Ubuntu 8.04 / Hardy Heron
--->
<cfoutput>
<!--- Set the fields required.
Note utc time (x_fp_timestamp) is a time in seconds since Jan 1 1970 based on GMT timezone
--->
<cfset x_fp_timestamp = "1219853058">
<cfset x_transaction_key = "PLEASE REPLACE WITH CURRENT TRANSACTION KEY">
<cfset x_login = "WSP-TEST-01-01">
<cfset x_amount = "30">
<cfset x_currency_code = "USD">
<cfset x_line_items = "">
<cfset x_fp_sequence = "344155">
<cfset x_invoice_num = "123">
<!--- A number of the fields are strung together and then hashed into a new hash field that is submitted in place of the password.
This way the password and merchant account are never both submitted
--->
<cfset hmac_data = x_login>
<cfset hmac_data = hmac_data & "^" & x_fp_sequence>
<cfset hmac_data = hmac_data & "^" & x_fp_timestamp>
<cfset hmac_data = hmac_data & "^" & x_amount>
<cfset hmac_data = hmac_data & "^" & x_currency_code>
<!--- Now hash this data string with the transaction key --->
<cfset x_fp_hash = java_hmac(x_transaction_key, hmac_data)>
<h2>Hash obtained </h2>
<ul>
<b> #x_fp_hash# </b>
</ul>
</cfoutput>
<cffunction name="java_hmac" returntype="string" access="public" output="false">
<cfargument name="signKey" type="string" required="true" />
<cfargument name="signMessage" type="string" required="true" />
<cfset var jMsg = JavaCast("string",arguments.signMessage).getBytes("UTF8") />
<cfset var jKey = JavaCast("string",arguments.signKey).getBytes("UTF8") />
<cfset var key = createObject("java","javax.crypto.spec.SecretKeySpec") />
<cfset var mac = createObject("java","javax.crypto.Mac") />
<!-- HMAC MD5 (uncomment to choose MD5, then comment SHA1)
<cfset key = key.init(jKey,"HmacMD5") />
-->
<cfset key = key.init(jKey,"HmacSHA1") />
<cfset mac = mac.getInstance(key.getAlgorithm()) />
<cfset mac.init(key) />
<cfset mac.update(jMsg) />
<cfreturn LCase(BinaryEncode(mac.doFinal(), 'Hex')) />
</cffunction>