Hi Chriss,
Hi executed below Groovy code with JSR223 sampler and got an error for that.

*Code:*
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("d552a1b3-3558-3c47-b34a-1ba87558b74b") ?:
"defaultKey"
def secret = System.getenv("vz7noe5z17i2usV58oFR5YMtU1BUFL0Ah9+eXuwV6IQ=")
?: "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("=", "")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

// put the result in jmeter vars
vars.put("signature",macSignatureBase64)
vars.put("timestamp","" + ts)

// Debug output
println "Signature: ${macSignatureBase64}"
println "Timestamp: ${ts}"

*Getting this error:*
[image: image.png]

On Thu, Apr 3, 2025 at 11:30 PM Christof Schmalenbach <
c.schmalenb...@perfomatics.com> wrote:

> I see that my last mail was not well formatted; here another trial...
>
> 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("=", "")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
>
> // put the result in jmeter vars
> vars.put("signature",macSignatureBase64)
> vars.put("timestamp","" + ts)
>
> // Debug output
> println "Signature: ${macSignatureBase64}"
> println "Timestamp: ${ts}"
>
>      .replace("+", "-")
>      .replace("/", "_")
>
> // Simulated environment variable storage (Postman equivalent)
> def environment = [:] // A map to mimic Postman environment variables
> environment["signature"] = macSignatureBase64
> environment["timestamp"] = ts
>
> // put the result in jmeter vars
> vars.put("signature",macSignatureBase64)
> vars.put("timestamp","" + ts)
>
> // Debug output
> println "Signature: ${macSignatureBase64}"
> println "Timestamp: ${ts}"
>
>
> On 4/3/25 19:49, Christof Schmalenbach wrote:
> > 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?
> >>>>>>>>
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscr...@jmeter.apache.org
> For additional commands, e-mail: user-h...@jmeter.apache.org
>
>

Reply via email to