Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Import private key from .p12 file to sign an XML file with XAdES-BES Signature #132

Open
jhcueva opened this issue Apr 10, 2023 · 0 comments

Comments

@jhcueva
Copy link

jhcueva commented Apr 10, 2023

Hello everyone I'm using xadesjs specifically the XAdES-BES Signature, to sign a document that will be validated by the entity to manage the payment of Ecuadorian taxpayers. I've been following the steps of the documentation.
First I have lo load the private key in order to use the function SignXml(xmlString, keys, algorithm). For that I have implemented the following code:

const fs = require("fs");
var { Crypto } = require("@peculiar/webcrypto");
const xadesjs = require("xadesjs");
const { XMLSerializer } = require("xmldom");

const crypto = new Crypto();
xadesjs.Application.setEngine("NodeJS", new Crypto());

// Hash and algorith from the example
const hash = "SHA-1";
const alg = {
  name: "RSASSA-PKCS1-v1_5",
  hash,
};

function preparePem(pem) {
  return (
    pem
      // remove BEGIN/END
      .replace(/-----(BEGIN|END)[\w\d\s]+-----/g, "")
      // remove \r, \n
      .replace(/[\r\n]/g, "")
  );
}

function pem2der(pem) {
  pem = preparePem(pem);
  // convert base64 to ArrayBuffer
  return new Uint8Array(Buffer.from(pem, "base64")).buffer;
}

// Set the path of the  .p12 file
const path = require("path");
const p12Path = path.resolve(__dirname, "cert.p12");

//Read key
const keyPem = fs.readFileSync(p12Path, { encoding: "utf-8" });
const keyDer = pem2der(keyPem);

//Retrieve the key to sign the document
const key = xadesjs.Application.crypto.subtle.importKey(
  "pkcs8",
  keyDer,
  alg,
  false,
  ["sign"]
);

But I have the following error:

            throw new Error(asn1Parsed.result.error);
                  ^

Error: End of input reached before message was fully decoded (inconsistent offset and length values)
    at Function.parse (/home/baeto/Documents/xades/node_modules/@peculiar/asn1-schema/build/cjs/parser.js:14:19)
    at Function.importKey (/home/baeto/Documents/xades/node_modules/@peculiar/webcrypto/build/webcrypto.js:863:54)
    at RsaSsaProvider.onImportKey (/home/baeto/Documents/xades/node_modules/@peculiar/webcrypto/build/webcrypto.js:1036:37)
    at RsaSsaProvider.importKey (/home/baeto/Documents/xades/node_modules/webcrypto-core/build/webcrypto-core.js:234:33)
    at SubtleCrypto.importKey (/home/baeto/Documents/xades/node_modules/webcrypto-core/build/webcrypto-core.js:1475:29)
    at Object.<anonymous> (/home/baeto/Documents/xades/index.js:42:47)
    at Module._compile (node:internal/modules/cjs/loader:1105:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)

Any suggestions are welcome!

@jhcueva jhcueva changed the title Import private key from .p12 file Import private key from .p12 file to sign an XML file with XAdES-BES Signature Apr 10, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant