Files
js-scripts/components/component-pki.js
2025-04-04 17:19:07 +08:00

150 lines
6.2 KiB
JavaScript

var gpg = require('component-gpg-ex.js');
var File = java.io.File;
var ECSignatureTool = Packages.me.hatter.tools.commons.security.sign.SignatureTool;
var DEFAULT_SIGN_FILE_EXT = '.sig.txt';
var DEFAULT_PGP_KEY_ID = '6FAFC0E0170985AA71545483C794B1646A886CD6';
var DEFAULT_EC_PRIVATE_KEY_PGP_ENC = '-----BEGIN PGP MESSAGE-----\n' +
'Comment: GPGTools - https://gpgtools.org\n' +
'\n' +
'hQIMA8N6kJ6vG/sAAQ//ef8seBe4daxW1tQg12G6tE2VhA1Y0W/Y3GKCtAxM8PwC\n' +
'j/VjanTqozVwVQp7Qb3hHoBkEJBAEjrNtIhUE7dJBSbrGkK5i8mkQpkc8MFgtx1A\n' +
'LVkhdNkTWenk07l6d56v0+iVjlWJsl9wlpP9eY3GkqkWydCXPEn0rICrB3mBf2BA\n' +
'SRPqucnzSpIjH+KXhUcyVFjU86ZHyzoRP5RwG2MVVSWhwt7Oyd9A6p1hAKHKIjwH\n' +
'K1W4PhxwrjnelcVWC2uwSLWXqgdXQ0EZXMzH5fv3R2EdZopyaC7AF6/jtauEs5RO\n' +
'X4l64jjfajqswSZKW0fGKqJgPVzb3p2fBGBeBFx2sYGU/Xk7QTQlfKOvADzLdEIE\n' +
'hw/i1Huo/xSg4CYiyjlVw82x6cA10UP2d7KRA21NPqWQUKv9p6aWpjkXoM1UE+5D\n' +
'TdyHSnT0Fu+VaBsGZ+3/x+oRlM6PHjk22n8CUEsZecYzGnyXyAEJuCaYOVtfSMTW\n' +
'gdy13gJInaxMawHHyRVFqJClZsXc4LEsSsY4fdTus6mEkD+S5S2gkoFffB6uLWYL\n' +
'pq59IIJ+tp2Y3wxCqUXhu0PYer5No7lU/A53+dtcj7xQYLoOUlB/DkHWfmqAsJi7\n' +
'Zt+SXoy0ksCtXciBZRhuJESbISALjKqOfQIV/8J9GrN/zQl/dzEmrfgqE00hY1bS\n' +
'kQFX26y+2iY7k2xoLg+fNB6LNKmtM4U6115CL+rcX3p02P1f4E6O4gGEg9l/3fe2\n' +
'rz7+2a3WK/MNE1Ak7ImFf6ufU3PHUCQqyEqk7wGeNmRRG3SPJUyBQbpa6I+4xTZ8\n' +
'R6RqgeigqUMDFyyIwYULEwP+dqnHfRBeckh3MKGfrHQUmgrGDOYawxb1G+h2iaVC\n' +
'VtA=\n' +
'=QCYC\n' +
'-----END PGP MESSAGE-----';
var DEFAULT_EC_PUBLIC_KEY = 'MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESZWG1x7tlv02YF+UZzuZdLquR6Oi3H7QRmaRWzDoupG66dWeKruRUQVj2ozliDKaRQ+5b91u/z9BApIaFs6quw==';
var generateECsecp256r1KeyPair = () => {
var ecSignTool = ECSignatureTool.secp256r1();
ecSignTool.generateKeyPair();
return {
'privKey': ecSignTool.encodePriKey(),
'pubKey': ecSignTool.encodePubKey()
};
};
var __defaultEcPrivateKeyBytes = null;
var getDefaultEcPrivateKeyBytes = () => {
if (__defaultEcPrivateKeyBytes != null) { return __defaultEcPrivateKeyBytes; }
var __defaultEcPrivateKeyLocalFile = $$.file('~/.jssp/config/.defaultecprivatekey.json');
if (__defaultEcPrivateKeyLocalFile.exists()) {
return __.bytes.fromBase64(JSON.parse($$.rFile(__defaultEcPrivateKeyLocalFile).string()).base64Key);
}
var tempPrivKeyFile = File.createTempFile('component-pki', '.temp_key');
$$.rFile(tempPrivKeyFile).write(DEFAULT_EC_PRIVATE_KEY_PGP_ENC);
tempPrivKeyFile.deleteOnExit();
var privKey = gpg.decrypt(tempPrivKeyFile.getAbsolutePath());
__defaultEcPrivateKeyBytes = __.bytes.fromBase64(privKey.trim());
__defaultEcPrivateKeyLocalFile.getParentFile().mkdirs();
$$.rFile(__defaultEcPrivateKeyLocalFile).write(JSON.stringify({
'date': $$.date().fmt('yyyy-MM-dd HH:mm:ss Z').format($$.date().today()),
'base64Key': __defaultEcPrivateKeyBytes.asBase64()
}));
return __defaultEcPrivateKeyBytes;
};
var getDefaultEcPublicKeyBytes = () => {
return __.bytes.fromBase64(DEFAULT_EC_PUBLIC_KEY);
};
var getDefaultEcSignSignature = () => {
return ECSignatureTool.secp256r1().decodePriKey(getDefaultEcPrivateKeyBytes()).signSHA256ECDSA();
};
var getDefaultEcVerifySignature = () => {
return ECSignatureTool.secp256r1().decodePubKey(getDefaultEcPublicKeyBytes()).verifySHA256ECDSA();
};
var defaultSignFile = (file) => {
file = $$.file(file);
if (file.getName().endsWith(DEFAULT_SIGN_FILE_EXT) || !(file.exists()) || !(file.isFile())) {
return false;
}
var signFile = $$.file(file.getAbsoluteFile().getParentFile(), file.getName() + DEFAULT_SIGN_FILE_EXT);
var sigHex = $$.rFile(file).sign(getDefaultEcSignSignature()).asHex();
$$.rFile(signFile).write(JSON.stringify({
'length': $$.str(file.length()),
'lastModified': $$.str(file.lastModified()),
'signature': sigHex
}));
return true;
};
var defaultSignFileV2 = (file) => {
file = $$.file(file);
if (file.getName().endsWith(DEFAULT_SIGN_FILE_EXT) || !(file.exists()) || !(file.isFile())) {
return false;
}
var signFile = $$.file(file.getAbsoluteFile().getParentFile(), file.getName() + DEFAULT_SIGN_FILE_EXT);
var sha256 = $$.rFile(file).digest(__.digests.sha256()).asHex();
var sigHex = __.bytes.fromHex(sha256).sign(getDefaultEcSignSignature()).asHex();
$$.rFile(signFile).write(JSON.stringify({
'version': 2,
'length': $$.str(file.length()),
'lastModified': $$.str(file.lastModified()),
'SHA256': sha256,
'signature': sigHex
}));
return true;
};
var defaultQuickVerifyFile = (file) => {
file = $$.file(file);
if (file.getName().endsWith(DEFAULT_SIGN_FILE_EXT) || !(file.exists()) || !(file.isFile())) {
return null;
}
var signFile = $$.file(file.getAbsoluteFile().getParentFile(), file.getName() + DEFAULT_SIGN_FILE_EXT);
if (!(signFile.exists())) {
return null;
}
var signatureJSON = JSON.parse($$.rFile(signFile).string().trim());
return $$.strEquals(file.length(), signatureJSON.length) && $$.strEquals(file.lastModified(), signatureJSON.lastModified);
};
var defaultVerifyFile = (file) => {
file = $$.file(file);
if (file.getName().endsWith(DEFAULT_SIGN_FILE_EXT) || !(file.exists()) || !(file.isFile())) {
return null;
}
var signFile = $$.file(file.getAbsoluteFile().getParentFile(), file.getName() + DEFAULT_SIGN_FILE_EXT);
if (!(signFile.exists())) {
return null;
}
var signatureJSON = JSON.parse($$.rFile(signFile).string().trim());
if (signatureJSON.version) {
var sha256 = $$.rFile(file).digest(__.digests.sha256());
return $$.strEquals(sha256.asHex(), signatureJSON.SHA256) && sha256.verify(getDefaultEcVerifySignature(), __.bytes.fromHex(signatureJSON.signature));
} else {
return $$.rFile(file).verify(getDefaultEcVerifySignature(), __.bytes.fromHex(signatureJSON.signature));
}
};
if (typeof exports == 'object') {
exports.generateECsecp256r1KeyPair = generateECsecp256r1KeyPair;
exports.getDefaultEcPrivateKeyBytes = getDefaultEcPrivateKeyBytes;
exports.getDefaultEcPublicKeyBytes = getDefaultEcPublicKeyBytes;
exports.getDefaultEcSignSignature = getDefaultEcSignSignature;
exports.getDefaultEcVerifySignature = getDefaultEcVerifySignature;
exports.defaultSignFile = defaultSignFile;
exports.defaultVerifyFile = defaultVerifyFile;
exports.defaultSignFileV2 = defaultSignFileV2;
exports.defaultQuickVerifyFile = defaultQuickVerifyFile;
}