Hi Abhitosh,
I'm not sure, whether I understand your js code completely.
But I got at least an idea. This is the result of my code migration.
I test the code in a jmeter script within a jsr223 sampler and it seems
to work.
(OpenJDK version 19.X; may be that in java version 8.X not all packages
used are supported???)

regards
Christof

import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec import
java.util.Base64 // Retrieve environment variables (using System.getenv
as an example) def key = System.getenv("appKey") ?: "defaultKey" def
secret = System.getenv("appSecret") ?: "am1ldGVy" def ts =
System.currentTimeMillis() def baseString = "${key}-2-${ts}" // Decode
the secret from Base64 def secretDecoded = Base64.decoder.decode(secret)
// Generate HMAC-SHA256 hash Mac mac = Mac.getInstance("HmacSHA256")
mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256")) byte[]
macSignature = mac.doFinal(baseString.getBytes("UTF-8")) // Encode the
signature to Base64 and sanitize it def macSignatureBase64 =
Base64.encoder.encodeToString(macSignature) .replace("=", "")
.replace("+", "-") .replace("/", "_") // Simulated environment variable
storage (Postman equivalent) def environment = [:] // A map to mimic
Postman environment variables environment["signature"] =
macSignatureBase64 environment["timestamp"] = ts // Debug output println
"Signature: ${macSignatureBase64}" println "Timestamp: ${ts}"



On 4/3/25 16:32, Abhitosh Patil wrote:
Javascript:

var key = pm.environment.get('appKey);

var secret = pm.environment.get('appSecret);

var ts = (new Date()).getTime());
var baseString = key + "-" + "2" + "-" + ts;

var words = CryptoJS. enc.Base64.parse(secret);

vaz macSignature = CryptoJS. HmacSHA256 (CryptoJS. enc. Utf8.parse
(baseString), words);

var macSignatureBase64 = macSignature.toString (CryptoJS. enc.Base64);

macSignatureBase64 = macSignatureBase64.replace(/=/g, "");

mac SignatureBase64 = macSignatureBase64.replace(/\+/g, "-");

macSignatureBase64 = macSignatureBase64.replace(/\//g, "_");

postman.setEnvironmentVariable("signature", macSignatureBase64);

postman, setEnvironmentVariable("timestamp", ts);

On Thu, 3 Apr, 2025, 5:12 pm Christof,<c.schmalenb...@perfomatics.com>
wrote:

Hi Abhitosh,
is the javascript script small in size?
If so you could remove or replace with dummies all hardcoded security
related parts and attach the script in this channel.
May be , that someone will take the challenge and migrate it to groovy .
It it is 100 lines or more I will not have the time to do that. Otherwise
I will give it a chance.

Christof



Am 3. April 2025 09:02:36 UTC schrieb Abhitosh Patil <
abhitosh...@gmail.com>:
Unfortunately ChatGPT or other AI tools are not allowed in our
organisation
network.

On Wed, 2 Apr, 2025, 9:04 pm Abhitosh Patil,<abhitosh...@gmail.com>
wrote:
Thank you Chris.
I'll check this possibility.

On Wed, 2 Apr, 2025, 9:03 pm Christof,<c.schmalenb...@perfomatics.com>
wrote:

Hi Abhitosh,
groovy is one of the supported languages in jsr223 sampler. If your
javascript has not thousand codelines, I'm very optimistic, that with
the
help of chatGPT you should be able to migrate your code
from js -> groovy.
regards
Christof


Am 2. April 2025 14:49:15 UTC schrieb Abhitosh Patil <
abhitosh...@gmail.com>:
Initially I was using Java 17 but later switched to java 8
Currently getting error like "javax.script.scriptExecution: reference
error: pm is not defined.

Rhino or Graalvm are not available on our company download portal.

I don't know anything about Groovy.

On Wed, 2 Apr, 2025, 8:10 pm Dmitri T,<glin...@live.com>  wrote:

   1.
You answered your own question: JavaScript code cannot be run in
JMeter.

   1.
Also, if you're  on Java 15+ you won't be able able to choose
JavaScript
in JSR223 test elements because it has been removed from JDK< 
https://openjdk.org/jeps/372>
   2.
There could be inconsistencies between Postman JavaScript API and
JMeter
so you won't have access to pm. namespace in JMeter


So you either need to restore JavaScript engine by adding Mozilla
Rhino<
https://github.com/mozilla/rhino> or switching to GraalVM< 
https://www.graalvm.org/>  or  re-write your code in Groovy. The
latter
option is better from performance perspective as Groovy scripts can
be
compiled and cached and it matters especially for "heavy" tasks like
cryptography. More information: Apache Groovy: What Is Groovy Used
For?<
https://www.blazemeter.com/blog/apache-groovy>



________________________________
From: Abhitosh Patil<abhitosh...@gmail.com>
Sent: Wednesday, April 2, 2025 5:14 PM
To: JMeter Users List<user@jmeter.apache.org>
Subject: Need to execute javascript using JMeter

We have a requirement to generate unique authentication signature to
pass
as a header in API request. We have a pre-request javascript for
same
in
postman tool.

Same javascript we tried in JMeter using jsr223 and beanshell
elements. But
it's not working. Any solution for this?

Reply via email to