Appendix 1
Signature Generation
Transaction Status Enquiry
- Java
- Node.js
- Python
- .Net
- PHP
String sourceSystem = "mxx";
String jsonStr = "{"
+ "\"Email\":\"\","
+ "\"TxnID\":\"20230615155030POS\","
+ "\"sourceSystem\":\"mxx\","
+ "\"sequenceNo\":\"1\""
+ "}";
String message = sourceSystem + "\n" + jsonStr;
String path = KEYPAIR_DIR + "private_key.pem";
FileReader fileReader = new FileReader(path);
PEMParser pemParser = new PEMParser(fileReader);
PEMKeyPair pemKeyPair = (PEMKeyPair) pemParser.readObject();
byte[] encodedPrivateKey = pemKeyPair.getPrivateKeyInfo().getEncoded();
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
Signature privateSignature = Signature.getInstance("SHA256withRSA");
privateSignature.initSign(privateKey);
privateSignature.update(message.getBytes(StandardCharsets.UTF_8));
byte[] signature = privateSignature.sign();
String signatureStr = URLEncoder.encode(Base64.getEncoder().encodeToString(signature));
const privateKeyPath = "private_key.pem";
const fetchPrivateKey = async (path) => {
try {
const response = await fetch(path);
const privateKey = await response.text();
return privateKey;
catch (error) {}
}
};
const privateKey = await fetchPrivateKey(privateKeyPath);
const rsaPrivateKey = forge.pki.privateKeyFromPem(privateKey);
const sourceSystem = 'mxx';
const request = {
Email: '',
TxnID: '06a8735d-aa4d-4d89-a453-508be0122119',
sourceSystem: sourceSystem,
sequenceNo: '1',
};
const jsonString = JSON.stringify(request);
const data = `{sourceSystem}\n${jsonString}`;
//encryption step
const privateKey = await fetchPrivateKey(privateKeyPath);
const rsaPrivateKey = forge.pki.privateKeyFromPem(privateKey);
const md = forge.md.sha256.create();
md.update(data, 'utf8');
const signature = rsaPrivateKey.sign(md);
const signedMessage = encodedURIComponent(forge.util.encode64(signature));
private_key_path = r"...\"
with open(private_key_path, "rb") as f:
private_key_data = f.read()
private_key = serialization.load_pem_private_key(private_key_data, password=None, backend=default_backend())
sourceSystem = "mxx"
request_data = OrderedDict()
request_data["Email"] = ""
request_data["TxnID"] = "06a8735d-aa4d-4d89-a453-508be0122119"
request_data["sourceSystem"] = sourceSystem
request_data["sequenceNo"] = "1"
json_output = json.dumps(request_data, separators=(",", ":"))
data = f"{sourceSystem}\n{json_output}"
signature = private_key.sign(
data.encode('utf-8'),
padding.PKCSv15(),
hashes.SHA256()
)
encoded_signature = base64.b64encode(signature).decode('utf-8')
url_encoded_signature = urllib.parse.quote(encoded_signature, safe='')
request_data["signedMessage"] = url_encoded_signature
string sourceSystem = "mxx";
string jsonStr = "{"
+ "\"Email\":\"\","
+ "\"TxnID\":\"\","
+ "\"sourceSystem\":\"\","
+ "\"sequenceNo\":\"\""
+ "}";
using (RSA rsa = RSA.Create())
{
//private key used to sign message
var reader = System.IO.File.ReadAllText(@"E:\xaas_development\Business_Idea_MyXaas\EPFDemo\WebApplication3\wwwroot\key\mxx\mxx_keypair\private_key.pem");
String data = sourceSystem +"\n"+ jsonStr;
rsa.ImportFromPem(reader.ToCharArray());
byte[] signature = rsa.SignData(Encoding.UTF8.GetBytes(data), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
bool verify = rsa.VerifyData(Encoding.UTF8.GetBytes(data), signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
signedMessage = Uri.EscapeDataString(Convert.ToBase64String(signature));
}
$sourceSystem = "mxx";
$jsonString = '{'
. '"Email":"",'
. '"TxnID":"06a8735d-aa4d-4d89-a453-508be0122119",'
. '"sourceSystem":"' . $sourceSystem . '",'
. '"sequenceNo":"1"'
. '}';
$data = $sourceSystem . "\n" . $jsonString;
$privateKey = file_get_contents('key/mxx/mxx_keypair/private_key.pem');
//Sign the data
$rsa = openssl_get_privatekey($privateKey);
openssl_sign($data, $signature, $rsa, OPENSSL_ALGO_SHA256);
$signedMessage = urlencode(base64_encode($signature));