Watz
10/17/2020, 3:14 PMbattk
10/17/2020, 3:14 PMbattk
10/17/2020, 3:14 PMCrypto.getRandomValues
Watz
10/17/2020, 3:15 PMbattk
10/17/2020, 3:19 PMbattk
10/17/2020, 3:19 PMWatz
10/17/2020, 3:20 PMbattk
10/17/2020, 3:21 PMWatz
10/17/2020, 3:22 PMbattk
10/17/2020, 3:25 PMbattk
10/17/2020, 3:25 PMWatz
10/17/2020, 3:26 PMWatz
10/17/2020, 3:28 PMbattk
10/17/2020, 3:38 PMbattk
10/17/2020, 3:38 PMbattk
10/17/2020, 3:39 PMWatz
10/17/2020, 3:39 PMWatz
10/17/2020, 3:41 PM@NApiVersion 2.1
atleast 🙂battk
10/17/2020, 3:46 PMbattk
10/17/2020, 3:48 PMdefine(["./getRandomValuesPolyfill.js", "./base64.js"], function(getRandomValuesPolyfill, base64) {
(function() {
//this.window = this;
this.self = this;
this.navigator = {
userAgent: ""
};
this.crypto = {
getRandomValues: getRandomValuesPolyfill
};
this.atob = base64.Base64.atob;
this.btoa = base64.Base64.btoa;
})()
return {}
})
battk
10/17/2020, 3:48 PMWatz
10/17/2020, 3:54 PMbattk
10/17/2020, 3:55 PMWatz
10/17/2020, 3:55 PMbattk
10/17/2020, 3:56 PMbattk
10/17/2020, 3:56 PMbattk
10/17/2020, 3:58 PMWatz
10/17/2020, 3:58 PM/**
* @NApiVersion 2.1
* @NScriptType ScheduledScript
*/
define(['N/log', 'N/runtime','./lib/shim.js''./lib/openpgp.js'],
/**
* @param{log} log
* @param{runtime} runtime
* @param{shim} shim
* @param{openpgp} openpgp
*/
(log, runtime,shim,openpgp) => {
/**
* Defines the Scheduled script trigger point.
* @param {Object} scriptContext
* @param {string} scriptContext.type - Script execution context. Use values from the scriptContext.InvocationType enum.
* @since 2015.2
*/
const execute = (scriptContext) => {
log.debug('testing');
}
return {execute}
});
Watz
10/17/2020, 3:58 PMbattk
10/17/2020, 3:58 PMbattk
10/17/2020, 3:59 PMbattk
10/17/2020, 3:59 PMWatz
10/17/2020, 4:04 PMWatz
10/17/2020, 4:05 PMbattk
10/17/2020, 4:09 PMbattk
10/17/2020, 4:09 PMWatz
10/17/2020, 4:11 PMbattk
10/17/2020, 4:12 PMWatz
10/17/2020, 4:13 PMbattk
10/17/2020, 4:14 PMWatz
10/17/2020, 4:16 PMWatz
10/17/2020, 4:57 PM/**
* @NApiVersion 2.1
* @NScriptType ScheduledScript
*/
define(['N/log', 'N/runtime','./lib/shim.js','./lib/openpgp.js'],
/**
* @param{log} log
* @param{runtime} runtime
* @param{shim} shim
* @param{openpgp} openpgp
*/
(log, runtime,shim,openpgp) => {
/**
* Defines the Scheduled script trigger point.
* @param {Object} scriptContext
* @param {string} scriptContext.type - Script execution context. Use values from the scriptContext.InvocationType enum.
* @since 2015.2
*/
const execute = (scriptContext) => {
log.debug('start script');
async function test(){
log.debug('test start');
// put keys in backtick (``) to avoid errors caused by spaces or tabs
const publicKeyArmored = `-----BEGIN PGP PUBLIC KEY BLOCK-----
xo0EX4r8UwEEANl9YnR4IpDGossbtPISCCdIaqHNZDdbzk6jWugT3YakHIT+GHal
...
3o7T7Yv3bdHk0urZnnl3jbYYJJ/1AOgDdqheh1INZTytnLGUKeFNupdVpXjFn377
7FCc
=Qr6K
-----END PGP PUBLIC KEY BLOCK-----`;
const privateKeyArmored = `-----BEGIN PGP PRIVATE KEY BLOCK-----
xcFGBF+K/FMBBADZfWJ0eCKQxqLLG7TyEggnSGqhzWQ3W85Oo1roE92GpByE/hh2
...
JJ/1AOgDdqheh1INZTytnLGUKeFNupdVpXjFn3777FCc
=YVRc
-----END PGP PRIVATE KEY BLOCK-----`; // encrypted private key
const passphrase = `testing`; // what the private key is encrypted with
log.debug('after constants...');
const { keys: [privateKey] } = await openpgp.key.readArmored(privateKeyArmored);
log.debug('after await openpgp.key.readArmored...'); //THIS IS LOGGED
await privateKey.decrypt(passphrase);
log.debug('after await privateKey.decrypt...'); //THIS IS NOT LOGGED
const { data: encrypted } = await openpgp.encrypt({
message: openpgp.message.fromText('Hello, World!'), // input as Message object
publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys, // for encryption
privateKeys: [privateKey] // for signing (optional)
});
log.debug('after await openpgp.encrypt...');
log.debug(encrypted); // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
const { data: decrypted } = await openpgp.decrypt({
message: await openpgp.message.readArmored(encrypted), // parse armored message
publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys, // for verification (optional)
privateKeys: [privateKey] // for decryption
});
log.debug(decrypted); // 'Hello, World!'
}
test();
log.debug('complete');
}
return {execute}
});
Watz
10/17/2020, 4:58 PMbattk
10/17/2020, 5:00 PMWatz
10/17/2020, 5:03 PMbattk
10/17/2020, 5:26 PMbattk
10/17/2020, 5:26 PMWatz
10/17/2020, 5:27 PMWatz
10/17/2020, 5:27 PMbattk
10/17/2020, 6:08 PMbattk
10/17/2020, 6:08 PMWatz
10/17/2020, 6:12 PMWatz
10/17/2020, 6:13 PMbattk
10/17/2020, 6:14 PMWatz
10/17/2020, 6:14 PMWatz
10/17/2020, 6:16 PMWatz
10/17/2020, 6:17 PMbattk
10/17/2020, 6:18 PMbattk
10/17/2020, 6:18 PMWatz
10/17/2020, 6:23 PMbattk
10/17/2020, 6:24 PMasync function readArmored(armoredText) {
try {
const input = await _armor2.default.decode(armoredText);
if (!(input.type === _enums2.default.armor.public_key || input.type === _enums2.default.armor.private_key)) {
throw new Error('Armored text not of type key');
}
return read(input.data);
} catch (e) {
const result = { keys: [], err: [] };
result.err.push(e);
return result;
}
}
battk
10/17/2020, 6:25 PMbattk
10/17/2020, 6:25 PMWatz
10/17/2020, 6:27 PMWatz
10/17/2020, 6:29 PMconst { keys: [privateKey], err: [readArmoredErrors]} = await openpgp.key.readArmored(privateKeyArmored);
log.debug('error.key',JSON.stringify(readArmoredErrors));
battk
10/17/2020, 6:33 PMbattk
10/17/2020, 6:34 PMbattk
10/17/2020, 6:35 PMWatz
10/17/2020, 6:36 PMWatz
10/17/2020, 6:37 PMbattk
10/17/2020, 6:38 PMbattk
10/17/2020, 6:38 PMbattk
10/17/2020, 6:38 PMbattk
10/17/2020, 6:38 PMbattk
10/17/2020, 6:39 PMWatz
10/17/2020, 6:40 PMbattk
10/17/2020, 6:41 PMbattk
10/17/2020, 6:41 PMbattk
10/17/2020, 6:42 PMWatz
10/17/2020, 6:46 PMWatz
10/17/2020, 6:46 PMWatz
10/17/2020, 6:47 PMWatz
10/17/2020, 6:53 PMbattk
10/17/2020, 6:55 PMbattk
10/17/2020, 6:56 PMWatz
10/17/2020, 7:00 PMWatz
10/17/2020, 7:01 PM/**
* @NApiVersion 2.1
* @NScriptType ScheduledScript
*/
define(['N/log', 'N/runtime','./lib/shim.js','./lib/openpgp.js'],
/**
* @param{log} log
* @param{runtime} runtime
* @param{shim} shim
* @param{openpgp} openpgp
*/
(log, runtime,shim,openpgp) => {
/**
* Defines the Scheduled script trigger point.
* @param {Object} scriptContext
* @param {string} scriptContext.type - Script execution context. Use values from the scriptContext.InvocationType enum.
* @since 2015.2
*/
const execute = (scriptContext) => {
log.debug('start script');
async function test(){
try {
const publicKeysArmored = `-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: OpenPGP.js v4.5.2
Comment: <https://openpgpjs.org>
xk0EX4s+JQECALHyDkjtRrB9nvc5DD6Swdyi0rQc/x3Yxt6iP08OUt+UimkG
jfAP/LmwTi5DrhLviE98fiDBzRljjb5zLS7rtJMAEQEAAc0UYmlsbCA8Ymls
bEBob21lLmNvbT7CdQQQAQgAHwUCX4s+JQYLCQcIAwIEFQgKAgMWAgECGQEC
GwMCHgEACgkQ1Y9hTVbPxV3RoAH+MqJq9OSfW+n9vVrzSfSHiF3sTN08T2o8
xU9tz4yEOuEdmVLZdrzFGYm5XyI7VO9UEhiqkKXCMRrg/EQli9yysM5NBF+L
PiUBAf9ViMyeyYldp3puNUqdCFXEJiFGKqpk05X264gwAtJ1soNFZ1OJtr0J
N6yPl4g/io+T8bw9F2We4RxpsgUImn0jABEBAAHCXwQYAQgACQUCX4s+JQIb
DAAKCRDVj2FNVs/FXbUQAgCvCuHeJW7sag4rjQE0Nn7AV0Hhrlha7QLbu9BC
kTVZ7e8arsNUbLTixF3T7+uLYaxMzRhxBMeiJxqIdk1hIPa/
=F5HS
-----END PGP PUBLIC KEY BLOCK-----`;
const privateKeyArmored = `-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: OpenPGP.js v4.5.2
Comment: <https://openpgpjs.org>
xcBmBF+LPiUBAgCx8g5I7UawfZ73OQw+ksHcotK0HP8d2Mbeoj9PDlLflIpp
Bo3wD/y5sE4uQ64S74hPfH4gwc0ZY42+cy0u67STABEBAAH+CQMIbOGq4B5I
BqXg/S2xufEamp8ZQ0FwLFeeYDvDi0mbS0w9yNKmc5Fc3SmD7wtUupckqNEO
xWdn6nmEUXRGPLEtgae1GJvC5EbS60g6pmX+mq5T4L7wxqlDMd0PHFBhkcIY
C3Tn5WNdSWeBs659POYc1hAbpwIEK7LkDz0KwMqNXV4IzlqEazsQsdVw+pgr
42Mri8sWvUIUGFOsT+fKH+RDKcyt8kzMauliAxFOxeElh9XqM7p6/BedtA0q
MBAqvD7cUVQ+Js5QE29QyQHaGWZ5ih38ndKvzRRiaWxsIDxiaWxsQGhvbWUu
Y29tPsJ1BBABCAAfBQJfiz4lBgsJBwgDAgQVCAoCAxYCAQIZAQIbAwIeAQAK
CRDVj2FNVs/FXdGgAf4yomr05J9b6f29WvNJ9IeIXexM3TxPajzFT23PjIQ6
4R2ZUtl2vMUZiblfIjtU71QSGKqQpcIxGuD8RCWL3LKwx8BmBF+LPiUBAf9V
iMyeyYldp3puNUqdCFXEJiFGKqpk05X264gwAtJ1soNFZ1OJtr0JN6yPl4g/
io+T8bw9F2We4RxpsgUImn0jABEBAAH+CQMIYi9pIyYo/3fgkCKZXkwOiRw7
cPP9hswBTo1paQHSlgnShN91E0CHMhnJYCIWifX8dR9tw8FomTCF8Xs8zLOy
bYZBwMrJM7yYfaOII83Jpop6sJpoFuuDK7vezoa+zdYTBObmuA8xuom3+6YX
y6oFsb3Pdu8TBL4H7O9vj8Be71J5+SqFmTwYbImxPpJzFIU/8M1EJATE0ImM
fxaO6t5mTd+mALO//X2c+WkGDtBvClSesgkdiBYlkyU20tc8HfejjbIejSgx
qFdleaJNvB+syz0uuNDSwl8EGAEIAAkFAl+LPiUCGwwACgkQ1Y9hTVbPxV21
EAIArwrh3iVu7GoOK40BNDZ+wFdB4a5YWu0C27vQQpE1We3vGq7DVGy04sRd
0+/ri2GsTM0YcQTHoicaiHZNYSD2vw==
=cIyF
-----END PGP PRIVATE KEY BLOCK-----`; // encrypted private key
const passphrase = `password`; // what the private key is encrypted with
const message = 'Hello, World!';
const { keys: [privateKey], err: [readArmoredErrors]} = await openpgp.key.readArmored(privateKeyArmored);
log.debug('error.key',readArmoredErrors);
await privateKey.decrypt(passphrase)
const publicKeys = await Promise.all(publicKeysArmored.map(async (key) => {
return (await openpgp.key.readArmored(key)).keys[0];
}));
const { data: encrypted } = await openpgp.encrypt({
message: openpgp.message.fromText(message), // input as Message object
publicKeys, // for encryption
privateKeys: [privateKey] // for signing (optional)
});
console.log(encrypted); // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
} catch (e) {
log.debug('ERROR','e.stack:'+ e.stack + 'e.message:' + e.message);
}
}
test();
log.debug('complete');
}
return {execute}
});
Watz
10/17/2020, 7:01 PMWatz
10/17/2020, 7:03 PMWatz
10/17/2020, 7:05 PMbattk
10/17/2020, 7:07 PMWatz
10/17/2020, 7:08 PMbattk
10/17/2020, 7:09 PMWatz
10/17/2020, 7:13 PMbattk
10/17/2020, 7:14 PMbattk
10/17/2020, 7:15 PMWatz
10/17/2020, 7:16 PMbattk
10/17/2020, 7:30 PMbattk
10/17/2020, 7:34 PMWatz
10/17/2020, 7:36 PMbattk
10/17/2020, 7:41 PM/**
* @NApiVersion 2.1
* @NScriptType Suitelet
*/
define(["./shim.js", "./openpgp.js"], function (shim, openpgp) {
async function test() {
const publicKeyArmored = `-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: OpenPGP.js v4.5.2
Comment: <https://openpgpjs.org>
xk0EX4s+JQECALHyDkjtRrB9nvc5DD6Swdyi0rQc/x3Yxt6iP08OUt+UimkG
jfAP/LmwTi5DrhLviE98fiDBzRljjb5zLS7rtJMAEQEAAc0UYmlsbCA8Ymls
bEBob21lLmNvbT7CdQQQAQgAHwUCX4s+JQYLCQcIAwIEFQgKAgMWAgECGQEC
GwMCHgEACgkQ1Y9hTVbPxV3RoAH+MqJq9OSfW+n9vVrzSfSHiF3sTN08T2o8
xU9tz4yEOuEdmVLZdrzFGYm5XyI7VO9UEhiqkKXCMRrg/EQli9yysM5NBF+L
PiUBAf9ViMyeyYldp3puNUqdCFXEJiFGKqpk05X264gwAtJ1soNFZ1OJtr0J
N6yPl4g/io+T8bw9F2We4RxpsgUImn0jABEBAAHCXwQYAQgACQUCX4s+JQIb
DAAKCRDVj2FNVs/FXbUQAgCvCuHeJW7sag4rjQE0Nn7AV0Hhrlha7QLbu9BC
kTVZ7e8arsNUbLTixF3T7+uLYaxMzRhxBMeiJxqIdk1hIPa/
=F5HS
-----END PGP PUBLIC KEY BLOCK-----`;
const privateKeyArmored = `-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: OpenPGP.js v4.5.2
Comment: <https://openpgpjs.org>
xcBmBF+LPiUBAgCx8g5I7UawfZ73OQw+ksHcotK0HP8d2Mbeoj9PDlLflIpp
Bo3wD/y5sE4uQ64S74hPfH4gwc0ZY42+cy0u67STABEBAAH+CQMIbOGq4B5I
BqXg/S2xufEamp8ZQ0FwLFeeYDvDi0mbS0w9yNKmc5Fc3SmD7wtUupckqNEO
xWdn6nmEUXRGPLEtgae1GJvC5EbS60g6pmX+mq5T4L7wxqlDMd0PHFBhkcIY
C3Tn5WNdSWeBs659POYc1hAbpwIEK7LkDz0KwMqNXV4IzlqEazsQsdVw+pgr
42Mri8sWvUIUGFOsT+fKH+RDKcyt8kzMauliAxFOxeElh9XqM7p6/BedtA0q
MBAqvD7cUVQ+Js5QE29QyQHaGWZ5ih38ndKvzRRiaWxsIDxiaWxsQGhvbWUu
Y29tPsJ1BBABCAAfBQJfiz4lBgsJBwgDAgQVCAoCAxYCAQIZAQIbAwIeAQAK
CRDVj2FNVs/FXdGgAf4yomr05J9b6f29WvNJ9IeIXexM3TxPajzFT23PjIQ6
4R2ZUtl2vMUZiblfIjtU71QSGKqQpcIxGuD8RCWL3LKwx8BmBF+LPiUBAf9V
iMyeyYldp3puNUqdCFXEJiFGKqpk05X264gwAtJ1soNFZ1OJtr0JN6yPl4g/
io+T8bw9F2We4RxpsgUImn0jABEBAAH+CQMIYi9pIyYo/3fgkCKZXkwOiRw7
cPP9hswBTo1paQHSlgnShN91E0CHMhnJYCIWifX8dR9tw8FomTCF8Xs8zLOy
bYZBwMrJM7yYfaOII83Jpop6sJpoFuuDK7vezoa+zdYTBObmuA8xuom3+6YX
y6oFsb3Pdu8TBL4H7O9vj8Be71J5+SqFmTwYbImxPpJzFIU/8M1EJATE0ImM
fxaO6t5mTd+mALO//X2c+WkGDtBvClSesgkdiBYlkyU20tc8HfejjbIejSgx
qFdleaJNvB+syz0uuNDSwl8EGAEIAAkFAl+LPiUCGwwACgkQ1Y9hTVbPxV21
EAIArwrh3iVu7GoOK40BNDZ+wFdB4a5YWu0C27vQQpE1We3vGq7DVGy04sRd
0+/ri2GsTM0YcQTHoicaiHZNYSD2vw==
=cIyF
-----END PGP PRIVATE KEY BLOCK-----`; // encrypted private key
const passphrase = `password`; // what the private key is encrypted with
const {
keys: [privateKey],
} = await openpgp.key.readArmored(privateKeyArmored);
await privateKey.decrypt(passphrase);
const { data: encrypted } = await openpgp.encrypt({
message: openpgp.message.fromText("Hello, World!"), // input as Message object
publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys, // for encryption
privateKeys: [privateKey], // for signing (optional)
});
log.debug("encrypted", encrypted); // '-----BEGIN PGP MESSAGE ... END PGP MESSAGE-----'
const { data: decrypted } = await openpgp.decrypt({
message: await openpgp.message.readArmored(encrypted), // parse armored message
publicKeys: (await openpgp.key.readArmored(publicKeyArmored)).keys, // for verification (optional)
privateKeys: [privateKey], // for decryption
});
log.debug("decrypted", decrypted); // 'Hello, World!'
}
function onRequest(context) {
log.debug("context", context);
test().catch(function (e) {
log.error("e", e);
log.error("e", e.stack);
});
}
return {
onRequest: onRequest,
};
});
battk
10/17/2020, 7:46 PMWatz
10/17/2020, 7:46 PMbattk
10/17/2020, 7:46 PMWatz
10/17/2020, 7:46 PMWatz
10/17/2020, 7:47 PMbattk
10/17/2020, 7:49 PMbattk
10/17/2020, 7:49 PMbattk
10/17/2020, 7:51 PMbattk
10/17/2020, 7:51 PMbattk
10/17/2020, 7:51 PMbattk
10/17/2020, 7:52 PMWatz
10/17/2020, 7:53 PMWatz
10/17/2020, 7:53 PMWatz
10/17/2020, 7:53 PMbattk
10/17/2020, 7:54 PMbattk
10/17/2020, 7:55 PMbattk
10/17/2020, 7:55 PMbattk
10/17/2020, 7:56 PMbattk
10/17/2020, 7:56 PMbattk
10/17/2020, 7:57 PMbattk
10/17/2020, 7:57 PMWatz
10/17/2020, 7:58 PMWatz
10/17/2020, 7:59 PMbattk
10/17/2020, 7:59 PMbattk
10/17/2020, 7:59 PMWatz
10/17/2020, 8:00 PMWatz
10/17/2020, 8:46 PMbattk
10/17/2020, 8:51 PMbattk
10/17/2020, 8:51 PMbattk
10/17/2020, 8:52 PMWatz
10/17/2020, 9:01 PMWatz
10/17/2020, 9:47 PMbattk
10/17/2020, 10:00 PMWatz
10/17/2020, 10:01 PMWatz
10/17/2020, 10:02 PMAshwin K.
10/19/2020, 7:10 PMbattk
10/19/2020, 7:17 PMlog.error({
title: 'An Error',
details: e
});
is not the same as
log.error({
title: 'An Error',
details: JSON.stringify(e)
});
Ashwin K.
10/19/2020, 11:52 PMbattk
10/20/2020, 12:06 AMbattk
10/20/2020, 12:07 AMbattk
10/20/2020, 12:07 AMbattk
10/20/2020, 12:09 AM