# Create JWS

### Code Samples

```go
package main

import (
	"encoding/json"
	"fmt"
	"time"

	"github.com/google/uuid"
	"github.com/lestrrat-go/jwx/v2/jwa"
	"github.com/lestrrat-go/jwx/v2/jwk"
	"github.com/lestrrat-go/jwx/v2/jws"
)

type Data struct {
	Ver           string `json:"ver"`
	Timestamp     string `json:"timestamp"`
	TxnId         string `json:"txnid"`
	ConsentHandle string `json:"ConsentHandle"`
}

func main() {

	data := Data{
		Ver:           "2.0.0",
		Timestamp:     time.Now().UTC().Format("2006-01-02T15:04:05.999Z"),
		TxnId:         uuid.New().String(),
		ConsentHandle: "465d1f35-f716-484f-a38e-30797d97b525",
	}
	// Convert struct to JSON string
	jsonData, err := json.Marshal(data)
	if err != nil {
		fmt.Println("Error: ", err)
		return
	}

	// Print the JSON data
	fmt.Println("Payload: ")
	fmt.Println(string(jsonData))

	const privateKeyJson = `{
		"p": "4xjtcjnYMkkX97rViwxE9ZfhegRLVCQ7begAE_tBZe6-imKCSdQlw5Hasv5XPjY_SvEwkF0PD5oK-VIPRm40qjFSvSKjpz4myJabfbMwZQYhvsxOcPRqVRolCDW_OIQ7lXVjDEvl_4GmwRyp_sWaAUKaVIoyWLas2QvXZ8q4Yz0",
		"kty": "RSA",
		"q": "rtTjLo-H9nuOWEbl403YTf34acVOAyhNXDMgkim2v0TpMDWOCgEJOFuGH2ILEVRY1Rrcep7ups4wiqDXP7aN8icA96okOhSUlMFPvropk9uabPdPJvM9jh6VE2SP1VEAMf4BeDwq_dE_FyKWxGLZrRbN4joJheY75YYYyWELMDU",
		"d": "FR73dPuWZgcvu57y8fHCaKQ142SCxvLxvC9mAsN4ztxWxCd7jjvqzJN7QUweEeqLHeQeTLcI7YcGL6cpUMGjA07XNSFjCKZyHtkeyCDNMvL91GVGluYxmIF66qu2f7EXqSsVElwlAHYUIs29b_H95Qpa53PiSMl97jfzQsG7W9X24KJM_NshPEmKvou0BWNmSFxNs66C-pq5i6Up224OY5a9bGXrRw5Vkv6QR7SwPhj0EFNkonMt1TK9vU4P5KLQ-82sEOqkTKtKYC86egj7gZKguqzhUkfw_kfghu-dGvnYeQ6h_7HQUvVsYRQJOutFrEuNvGay44SgDf1X0nZRcQ",
		"e": "AQAB",
		"use": "sig",
		"kid": "57ea893e-7e1c-4383-b013-f6c96e3bf776",
		"qi": "e3D3bnlVAPdqvg85eDh4Tp9VwM2VQjHSN_BLDl_8tm8Xbe68VzEpqBm_AEfA7OwlFuFWOGsQwCXO89kYJ6eF61jE_72zXRdrzseUM80c_nKIyx-ZlbijpTRp9VUnClMg4JcyZT4eWKkNurMFsf9vTWI4yayZqkJHc9J39B2MqLk",
		"dp": "sVO3pWfxn2Jf6rrjIA5WkockM0jDIVKhbTKpTPD2ogeIlTpSjh-v1URAx1--8_8b8QLgbvmbVw1r4D7pWo-XZAXbm4A-1cq8MgkYJVEUSu48z2VtItpXZVhi7kQ5qoHmnM_qpaFmWNr-QPCG9T-K_8zoAXdf1NHfqiOK8arjy-k",
		"alg": "RS256",
		"dq": "TS_EFRxdRJ8MG0FB4XbO1rAX6mqnpJE4hko0SRONkShVY2lhil0muvD9aAGbLU114q_3Q1PDvXUuzSVxorlwNcaukKlXUSUg7APktyntjU_Y_9633VRqisJJwsQVFHKsiWXBNFosCN9G4Wnt8kpKHDcDMqu45JrfOthXPSFRFTk",
		"n": "mxfLkK5DVngBOlVDdeFu_OQp3dIcfvHvoB1vU0DXTsTfZqpQa5ry9pI5N5lo5XxB_AUNw2bDPGCZBF6u6NKHsy50DXDfyh4VFz2SoxUQJELphfRwrHeugGsHuF3iyHxaXERyFjxjmzy9c3KKPszo_yzjVvZTfPesdyXRjZTXg-bqNIZbD8SrNDF8U0Nvh9kLlp0cfopbxuO4azts0rs3Z9WJZ-KnccFnEcgPvPkvLicsnlIyl3qUbZWFuoDKFgmItvGiOtwNBFtcwTRegrvbER-9bXByDB67KDryzzvdsLfRvs31snvdXSjF4BfXAXTuccQPLprKoHO0HkTq62b7oQ"
	}`
	privateKey, err := jwk.ParseKey([]byte(privateKeyJson))
	if err != nil {
		fmt.Printf("failed parse key: %sn", err)
		return
	}
	headers := jws.NewHeaders()
	headers.Set("b64", false)
	headers.Set("crit", []string{"b64"})

	serialized, err := jws.Sign(nil,
		jws.WithKey(jwa.RS256,
			privateKey,
			jws.WithProtectedHeaders(headers),
		),
		jws.WithDetachedPayload([]byte(jsonData)),
	)
	if err != nil {
		fmt.Printf("failed to sign payload: %sn", err)
		return
	}
	fmt.Println("Detached JWS Signature:")
	fmt.Println(string(serialized))
}
```

{% code title="Java" overflow="wrap" lineNumbers="true" %}

```java
public String signJws(String payload) throws JoseException {

  payload = signature Creation using the payload;

  Key = Public and Private Keypair Set

  JsonWebKeySet rsaJsonWebKeySet = new JsonWebKeySet(key);

  // Create a new JsonWebSignature object for the signing

  JsonWebSignature signerJws = new JsonWebSignature();

  // The content is the payload of the JWS
  signerJws.setPayload(payload);

  // Set the signature algorithm on the JWS
  signerJws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);

  RsaJsonWebKey jwk = (RsaJsonWebKey)rsaJsonWebKeySet.getJsonWebKeys().get(0);

  // The private key is used to sign
  signerJws.setKey(jwk.getPrivateKey());

  // Set the Key ID (kid) header because it's just the polite thing to do.
  signerJws.setKeyIdHeaderValue(jwk.getKeyId());

  // Set the "b64" header to false, which indicates that the payload is not
  // encoded 
  // when calculating the signature (per RFC 7797)
  signerJws
      .getHeaders()
      .setObjectHeaderValue(HeaderParameterNames.BASE64URL_ENCODE_PAYLOAD, false);

  // Produce the compact serialization with an empty/detached payload,
  // which is the encoded header + ".." + the encoded signature

  return signerJws.getDetachedContentCompactSerialization();
}
```

{% endcode %}

{% code title="Python" overflow="wrap" lineNumbers="true" fullWidth="false" %}

```python
from joserfc.rfc7797 import serialize_compact
from joserfc.jwk import RSAKey
import json

# Private Key 
private_key = RSAKey.import_key({
    "p": "4xjtcjnYMkkX97rViwxE9ZfhegRLVCQ7begAE_tBZe6-imKCSdQlw5Hasv5XPjY_SvEwkF0PD5oK-VIPRm40qjFSvSKjpz4myJabfbMwZQYhvsxOcPRqVRolCDW_OIQ7lXVjDEvl_4GmwRyp_sWaAUKaVIoyWLas2QvXZ8q4Yz0",
    "kty": "RSA",
    "q": "rtTjLo-H9nuOWEbl403YTf34acVOAyhNXDMgkim2v0TpMDWOCgEJOFuGH2ILEVRY1Rrcep7ups4wiqDXP7aN8icA96okOhSUlMFPvropk9uabPdPJvM9jh6VE2SP1VEAMf4BeDwq_dE_FyKWxGLZrRbN4joJheY75YYYyWELMDU",
    "d": "FR73dPuWZgcvu57y8fHCaKQ142SCxvLxvC9mAsN4ztxWxCd7jjvqzJN7QUweEeqLHeQeTLcI7YcGL6cpUMGjA07XNSFjCKZyHtkeyCDNMvL91GVGluYxmIF66qu2f7EXqSsVElwlAHYUIs29b_H95Qpa53PiSMl97jfzQsG7W9X24KJM_NshPEmKvou0BWNmSFxNs66C-pq5i6Up224OY5a9bGXrRw5Vkv6QR7SwPhj0EFNkonMt1TK9vU4P5KLQ-82sEOqkTKtKYC86egj7gZKguqzhUkfw_kfghu-dGvnYeQ6h_7HQUvVsYRQJOutFrEuNvGay44SgDf1X0nZRcQ",
    "e": "AQAB",
    "use": "sig",
    "kid": "57ea893e-7e1c-4383-b013-f6c96e3bf776",
    "qi": "e3D3bnlVAPdqvg85eDh4Tp9VwM2VQjHSN_BLDl_8tm8Xbe68VzEpqBm_AEfA7OwlFuFWOGsQwCXO89kYJ6eF61jE_72zXRdrzseUM80c_nKIyx-ZlbijpTRp9VUnClMg4JcyZT4eWKkNurMFsf9vTWI4yayZqkJHc9J39B2MqLk",
    "dp": "sVO3pWfxn2Jf6rrjIA5WkockM0jDIVKhbTKpTPD2ogeIlTpSjh-v1URAx1--8_8b8QLgbvmbVw1r4D7pWo-XZAXbm4A-1cq8MgkYJVEUSu48z2VtItpXZVhi7kQ5qoHmnM_qpaFmWNr-QPCG9T-K_8zoAXdf1NHfqiOK8arjy-k",
    "alg": "RS256",
    "dq": "TS_EFRxdRJ8MG0FB4XbO1rAX6mqnpJE4hko0SRONkShVY2lhil0muvD9aAGbLU114q_3Q1PDvXUuzSVxorlwNcaukKlXUSUg7APktyntjU_Y_9633VRqisJJwsQVFHKsiWXBNFosCN9G4Wnt8kpKHDcDMqu45JrfOthXPSFRFTk",
    "n": "mxfLkK5DVngBOlVDdeFu_OQp3dIcfvHvoB1vU0DXTsTfZqpQa5ry9pI5N5lo5XxB_AUNw2bDPGCZBF6u6NKHsy50DXDfyh4VFz2SoxUQJELphfRwrHeugGsHuF3iyHxaXERyFjxjmzy9c3KKPszo_yzjVvZTfPesdyXRjZTXg-bqNIZbD8SrNDF8U0Nvh9kLlp0cfopbxuO4azts0rs3Z9WJZ-KnccFnEcgPvPkvLicsnlIyl3qUbZWFuoDKFgmItvGiOtwNBFtcwTRegrvbER-9bXByDB67KDryzzvdsLfRvs31snvdXSjF4BfXAXTuccQPLprKoHO0HkTq62b7oQ"
})

# Headers
protected = {"alg": private_key.alg, "kid": private_key.kid, "b64": False, "crit": ["b64"]}

# Request Payload
payload = json.dumps({
    "ver":"1.1.2",
    "timestamp":"2024-04-25T12:51:22.638Z",
    "txnid":"f5e123a9-202c-4c7e-8bfa-9db9eea89ff2"
    }, separators=(',', ':'))
print("Payload: " + payload)

# Detached JWS Creation
value = serialize_compact(protected, payload, private_key)
print("Detached JWS: " + value)
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.saafe.in/fiu-module/jws-signature/create-jws.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
