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 > >