0

署名の例を見てきましたhttps://www.pdftron.com/documentation/nodejs/guides/features/signature/sign-pdf

signOnNextSave は PKCS #12 証明書を使用しますが、非対称署名には Google KMS を使用して秘密鍵を安全に保ちます。

Google Cloud KMS による署名と検証の例を次に示します

カスタム SignatureHandler を実装しようとしましたが、Node.JS API は Java や .NET とは異なります https://www.pdftron.com/api/pdfnet-node/PDFNet.SignatureHandler.html

カスタム署名および検証ロジックを実装するにはどうすればよいですか?

const data = Buffer.from('pdf data')

// We have 2048 Bit RSA - PSS Padding - SHA256 Digest key in Google Cloud KMS
const signAsymmetric = async () => {
  const hash = crypto.createHash('sha256')
  hash.update(data)
  const digest = hash.digest()
  const digestCrc32c = crc32c.calculate(digest)

  // Sign the data with Cloud KMS
  const [signResponse] = await client.asymmetricSign({
    name: locationName,
    digest: {
      sha256: digest
    },
    digestCrc32c: {
      value: digestCrc32c
    }
  })

  if (signResponse.name !== locationName) {
    throw new Error('AsymmetricSign: request corrupted in-transit')
  }
  if (!signResponse.verifiedDigestCrc32c) {
    throw new Error('AsymmetricSign: request corrupted in-transit')
  }
  if (
    crc32c.calculate(signResponse.signature) !==
    Number(signResponse.signatureCrc32c.value)
  ) {
    throw new Error('AsymmetricSign: response corrupted in-transit')
  }

  // Returns signature which is buffer
  const encoded = signResponse.signature.toString('base64')
  console.log(`Signature: ${encoded}`)

  return signResponse.signature
}

// Verify data with public key
const verifyAsymmetricSignatureRsa = async () => {
  const signatureBuffer = await signAsymmetric()
  const publicKeyPem = await getPublicKey()

  const verify = crypto.createVerify('sha256')
  verify.update(data)
  verify.end()

  const key = {
    key: publicKeyPem,
    padding: crypto.constants.RSA_PKCS1_PSS_PADDING
  }

  // Verify the signature using the public key
  const verified = verify.verify(key, signatureBuffer)
  return verified
}
4

1 に答える 1