Unable to Decrypt using crypto.subtle in node

I’m trying to encrypt and decrypt some string data on my application, but I really don’t know what I’m doing wrong.

I’ve create one example script, absolutely separate from any other problems, but it seems not solving anything.

I’m using Node 18, Windows and I need it to be runnable in Node and Browser

Here is my key pair generation block:
(It works like spected)


const StringToArrayBuffer = (str) => {
    const buf = new ArrayBuffer(str.length);
    const bufView = new Uint8Array(buf);
    for (let i=0; i<str.length; i++) {
        bufView[i] = str.charCodeAt(i);
    }
    return buf;
}

const exp = new Uint8Array([1, 0, 1]);
crypto.subtle.generateKey({
    name: 'RSA-OAEP',
    modulusLength: 2048,
    publicExponent: exp,
    hash: 'SHA-256',
}, true, ['encrypt','decrypt']).then(async ({publicKey, privateKey}) => {
    const publicKeyStr = Buffer.from((await crypto.subtle.exportKey('spki', publicKey))).toString("base64");
    const privateKeyStr = Buffer.from((await crypto.subtle.exportKey('pkcs8', privateKey))).toString("base64");

    console.log('-----BEGIN PUBLIC KEY-----');
    for(let i=0; i<publicKeyStr.length; i+=64)
        console.log(publicKeyStr.substring(i,i+64));
    console.log('-----END PUBLIC KEY-----');
    console.log('----------------------------');
    console.log('-----BEGIN PRIVATE KEY-----');
    for(let i=0; i<privateKeyStr.length; i+=64)
        console.log(privateKeyStr.substring(i,i+64));
    console.log('-----END PRIVATE KEY-----');
});

Here is my encrypt block:
(Paste generated public key from previous block. It also works like spected)

let pem = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi4RhcvypSg0d2+4nUnIn
l6KyOM+xEYN8MAIqq6HPwrHebyI0e4XoA6uA6kDhHykwlN/yB2ma9B2P8ME+YPEm
bDV1e9vJlIWB4VDfxlg/h+q5d41JovW4mMyRGLHI423TtAxgpX0sRe3afh8h/H3L
9V32UN3seXWt9lKeTUTrslJw3wDfKGiB1Yjeliyvlmif2+B3v1NqX1HNtgYYDlEF
T+pUlsIxmKB5CchcRhv1d3sNo34h7RkS3E3mHYR9erjNuPZedhO/RVAydp/HDIQh
G/3SnvUAsyVFEAksGukGTQicW8C9p+F6ypQlqGzqkPFlPk2jsjuc7p7FKVw6rglU
vQIDAQAB
-----END PUBLIC KEY-----`;

const pemHeader = "-----BEGIN PUBLIC KEY-----";
const pemFooter = "-----END PUBLIC KEY-----";
const pemContents = pem.substring(pemHeader.length, pem.length - pemFooter.length);
const binaryDerString = atob(pemContents);
const binaryDer = StringToArrayBuffer(binaryDerString);

const toEncrypt = "Here goes what you want to encrypt";

crypto.subtle.importKey("spki", binaryDer, { name: "RSA-OAEP", hash: "SHA-256" }, true, ["encrypt"]).then(key => {
    const dataToEncrypt = StringToArrayBuffer(toEncrypt);
    crypto.subtle.encrypt({name: "RSA-OAEP"}, key, dataToEncrypt).then((encoded) => {
        console.log('encoded', encoded);
        console.log('base64', btoa(String.fromCharCode.apply(null, new Uint8Array(encoded))));
    });
});

Then, It’s my decrypt block:
(Past a generated private key and previous base64 encrypt result section. Here’s where everything blows)

let pem = `-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCpy6X0gZ/S0daU
In0lT11ZCqhoUNPJNbGehIjyY6tK96Ek402sA19Pt7qDkRtT5VMvzx8zclUU3Jzy
zy66lUeTkWytUYqsWihEp0/VXKIO1vJrBBqGv4BEWlXJEW20j3O6507KeyZkuNbq
zUR+y36ED3HnYcpibWmS78movTIVH7uE8OhU+SHJAaLhKSOwIahmjTKeiRERb430
hktqnEHDpVw5ypJ2aiojS1i17dmmXyfgK9sSH8RCZ0VMBl2iQswiEtkD0Xpp+biC
f64KBxa/FXF/uf5B623ljkSIEgZPiOxqnbIySJ4fUS6OhG8GkP6rRn9DoBT6t/Xc
MR0JB1ubAgMBAAECggEASAXJHEDLoWo+4dELUoMqrnVV4AHBBA1RjVLcoCxk4UTO
xs3gCYHYsQDXDa3EcL7KnXH24ySxMEswC9KUGLLvjInYFmCLOPZ5ND3gIDnNyAun
AnvYIKYka1oCH2rUJQ3gYjxxcHPyYjEBgNGXJ018GdpPT31sknmkmZ465Odz0f9V
Uh6+U1xJhLLmSVnME5f6bzfxSHTssLGLLELVEJao/Cgoq2jf+0SpVKDSbw82e/lX
pw0dz+50Oj2fkLHCNwIvHTPSM8osxTwvMeqpKclp9zCifgzNYCdTSJS9/Cw/oW2o
eZK2DQqYTiXiQMgN/9dkIIsOn8haYkEjBCrRy9pA6QKBgQDi7Swlf36IjK+pMRrG
TEODE9jFJXudkfJspGA97xbXWnHuU+NHirrb9uqSkoicZlRApYOow/Wg6DgtKb64
yHd0oU7HfGWo8PG1l0c0M1PjSSq7nkBuMXGANjIUkPHedqks/78eMupjWV7QEhzW
aOhqCl1K7aZ1REeUSkohUSqddQKBgQC/jKvUC2RJT6e6tuqATDWcvjwBr/3Gsf9w
LjH09IUweqHT9K3JzOlmMmY3RX/gM3lU1KIOLZlolozTLJv9XDn1cT/Xqdc+r/Q3
pf+G5u4alOZD9aYjsZSmGsXydZ4njjIkJvX467zipVOtMFhSDGuburHBdvY5Z5ij
5jiX7HaizwKBgCjOb3baw104t0nce60W/7jtc7iX8e+20/o3YNsiSGA3cm9iBGfU
CaAOecYbtZcyS4pIeTF684uY1qlAbXx7CAggDbOPqhREJ6L47iPz6uzfNmEApyNp
nrhohn7uRaA0hF2EK9D5ZO6ynnsaFrdzq/+Nl5Mmwx0pRxnidgwhtWEVAoGAA67E
rvL5Hp+1bdWOdKECdt0Bclbb3jIV4yZAN6Fr3h69dcHChZq28gwOAwoHB1x1/LeJ
1hPyWxxp4LV+2kQnqRxgSdkuFjpzy44Zd5KBCWnLc4sJgq4rWXYyUBMK01/cfu1w
1TRTEVh0X2QKjqlGeFwChuGuojPnr18Bv4oATekCgYASK2ihWaCISwgVUhlSkzX/
2Lq+4VMkSwiNebja3CLjvSZ4VmzwkHIymrz9aGhd6+FwBNfqOtu3E2urkKBG9LBR
2o+3ypK2wKEgsmVtq5zQUx7hRtcsm/I/N4KDLE+1to+ouw4VXo5+Hv0aEziRJ3qK
ISPxbv2X9RfKrykBcf6e9g==
-----END PRIVATE KEY-----`;

const toDecrypt = "hN5/WIfroULCJqngEb10qn0LN/ET+OywKgbV/oEYReezKlImHo6TIcMJDF3fXTLiNLrTjBlnVBUyLEfdlsFj/0FeKVCBkaySGn/e3EsYQArjOdCD2DuNpiAdMR89CSmWLi1aPLU52MlX6h0VsE3TzdNyumAsimq3Eo8Ga8zdc9O8NCQED7gydHiogYG32uP79e/V/A4I44pPjSJhoeY0NAtLTMbU894GdBcES6/seEh5izROt7yb3F21T39jaY1M6sK6wMgEaGZojb6LLMI4EuMvIJ+TVjiWO0em6aZvjTkB+r0alArHmsAOyGWLFwqVHQ8dEu42EuMfSelPsUlZzg==";


const pemHeader = "-----BEGIN PRIVATE KEY-----";
const pemFooter = "-----END PRIVATE KEY-----";
const pemContents = pem.substring(pemHeader.length, pem.length - pemFooter.length);
const binaryDerString = atob(pemContents);
const binaryDer = StringToArrayBuffer(binaryDerString);

crypto.subtle.importKey("pkcs8", binaryDer, { name: "RSA-OAEP", hash: "SHA-256" }, true, ["decrypt"]).then(key => {
    const dataToDecrypt = StringToArrayBuffer(atob(toDecrypt));
    console.log(dataToDecrypt);
    crypto.subtle.decrypt({name: "RSA-OAEP"}, key, dataToDecrypt).then((decoded) => {
        console.log('It never logs, there is some error decrypting');
        console.log('decoded', decoded);
        console.log('utf-8', atob((new TextDecoder).decode(decoded))); // Here should be what you defined in previous block's variable toEncrypt
    }).catch(err => console.error(err));
});

What I’m doing wrong?
Almost three days lost in this whole thing… 🙁