digitalbazaar / forge

A native implementation of TLS in Javascript and tools to write crypto-based and network-heavy webapps
https://digitalbazaar.com/
Other
5.01k stars 767 forks source link

Postman usage got TypeError: o.start is not a function #1056

Closed quaos closed 7 months ago

quaos commented 8 months ago

Description

I'm trying to import the forge library into Postman from CDN for Request encryption: https://unpkg.com/node-forge@1.3.1/dist/forge.all.min.js

Collection Pre-Request script:

global = {};
window = {};
jQuery = null;

utils = {
    _pm: pm,
    _libs: {},

    setPm: (myPm) => {
        utils._pm = myPm;
    },

    useForge: (callback) => {
        const loadingInterval = setInterval(() => {}, 100);
        let lastResponse;
        return new Promise((resolve, reject) => {
            // REF.: https://postman-quick-reference-guide.readthedocs.io/en/latest/libraries.html
            utils._pm.sendRequest("https://unpkg.com/node-forge@1.3.1/dist/forge.all.min.js", (err, response) => {
                lastResponse = response;
                if (err || response.code >= 400) {
                    return reject(err);
                }
                const forgeCode = response.text();
                eval(forgeCode);
                resolve(window.forge);
            });
        })
        .then(async (forge) => {
            utils._libs.forge = forge;
            clearInterval(loadingInterval);

            const cbResult = callback && (await callback(null, myLib));

            return cbResult;
        })
        .catch(async (err) => {
            clearInterval(loadingInterval);
            const errMsg2 = "Could not load forge";
            console.error(errMsg2, err, { lastResponse });
            throw new Error(`${errMsg2}: ${err.message}`);
        });
    },

    publicEncrypt: (payload) => {
        const forge = utils._libs.forge;
        const publicKey = utils._pm.environment.get("publicKey");
        const pubKeyObj = forge.pki.publicKeyFromPem(publicKey);

        const md = forge.md.sha256;
        const encPayloadBinStr = pubKeyObj.encrypt(
            forge.util.encodeUtf8(payload),
            "RSA-OAEP",
            { md, mgf1: {  md } },
        );
        const encPayloadBase64 = Buffer.from(encPayloadBinStr, "binary").toString("base64");
        return encPayloadBase64;
    },
    // ...
};

Request's Pre-Request script:

pm.expect(utils).to.be.an("object");

utils.setPm(pm);
utils.useForge((forge) => {
    try {
        const payload = pm.environment.get("myPayload");

        const encPayloadBase64 = utils.publicEncrypt(payload);
        pm.environment.set("encryptedPayload", encPayloadBase64);
    } catch (err) {
        console.error(err, err.stack);
        throw err;
    }
});

Expected Behaviour

Actual Behaviour

Refs

quaos commented 7 months ago

Sorry! I mistook the padding/MD step. Should be:

const md = forge.md.sha256.create();

const encPayloadBinStr = pubKeyObj.encrypt(...);