sorry, I made a copy paste error, once again a fixed code snippet:... and an additional information: you must provide the appKey and the appSecret as an environment variable from outside. that means that you have to export those variables in the terminla from which you start your jmeter session, or as usual in an encapsulating shell script
// here the 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("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}" > Abhitosh Patil <abhitosh...@gmail.com> hat am 03.04.2025 21:15 CEST > geschrieben: > > > 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: > > > 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 > > --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@jmeter.apache.org For additional commands, e-mail: user-h...@jmeter.apache.org