JavaScript (Node.js)
Required Libraries:
jsonwebtoken
: For handling JWT tokens.elliptic
: For handling ECDSA signature generation and verification.uuid
: For generating unique identifiers.
npm install jsonwebtoken elliptic uuid
const jwt = require('jsonwebtoken');
const ECDSA = require('elliptic').ec;
const ec = new ECDSA('p521');
const uuid = require('uuid');
const { generateKeyPairSync } = require('crypto');
// Key generation
//const keyPair = ec.genKeyPair();
const { publicKey, privateKey } = generateKeyPairSync('ec', {
namedCurve: 'secp521r1', // This is equivalent to the p521 curve you were using
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem'
}
});
function signMessage(message, privateKey) {
const signature = ec.sign(message, privateKey, 'hex');
return Buffer.from(signature.toDER()).toString('base64');
}
// JWT header with custom 'typ' value
const jwtHeader = {
alg: 'ES512',
typ: 'ETAMP'
};
// Generate JWT token for a message
const id = uuid.v4();
const jti = uuid.v4();
const messageId = uuid.v4();
const senderId = uuid.v4();
const recipientId = uuid.v4();
const senderServerId = uuid.v4();
const payload = {
jti: jti,
exp: 1679992314,
nbf: 1679988714,
messageId: messageId,
senderUserName: "user1",
senderId: senderId,
recipient: "user2",
recipientId: recipientId,
senderServerName: "WebServer1",
senderServerId: senderServerId,
recipientServerName: "WebServer1",
recipientServerId: senderServerId, // Также используем senderServerId для recipientServerId
iss: `${senderServerId}.WebServer1.user1.${senderId}`,
sub: "Message",
audience: `${senderServerId}.WebServer1.user2.${recipientId}`,
message: "ereb5454bwehqwy-3hgerh34ebd=",
timestamp: new Date().toISOString()
};
const token = jwt.sign(payload, privateKey, {
algorithm: 'ES512',
header: jwtHeader
});
// ETAMP structure for a message
const message_etamp = {
Id: id,
Token: token,
SignatureToken: signMessage(token, privateKey),
SignatureMessage: signMessage(id + token + signMessage(token, privateKey), privateKey)
};
console.log(JSON.stringify(message_etamp, null, 4));
Last updated