"Cannot read properties of undefined (reading 'length')" when trying to work with output of pki.decryptRsaPrivateKey

オープン
#1,109 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
35/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
javascript

調査の方向性

Reproduce the supplied example and inspect the value passed from pki.decryptRsaPrivateKey into pki.wrapRsaPrivateKey. Trace the failure through lib/util.js:288 and lib/asn1.js:711, then determine the expected input and behavior for this encrypted PEM case. Done means the error is explained and the relevant key-conversion path is covered by a verified result.

索引モデルが issue の本文から書いたものです。

説明

I've an encrypted PEM key that I would like to feed into crypto.subtle.importKey. I can successfully decrypt the key via pki.decryptRsaPrivateKey, but I'm failing to make progress beyond that.

import forge from 'node-forge'

const key = `
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIu1+bbUTCodgCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBCfvVDbZMTGx6A4eXBxXdTtBIIE
0IlJLqI5V1b1CPLHWGlQ2m3TQyQUZv5stxhTgTfyS1+TwldqKOqXEimPISvz63rO
Mz07abeEa7Pz/97uNst9pkd6XMIa/X/B0CdYMt4FQDVvdIRJgsW9t9lxXxNRvzIO
ljXoAywXq5RBSswnPiB/z+luzj3EJeDidaNJ2r9PQAFVcNYZn+1gwSIPe5llkZqM
GjhxscMlIYllUNWo37WoLkock0pJbQ6b+HJJMBxJzo4lefUIgZQ7s4JWwc1OIvHc
K4p16GTd7wz3FcOtrfSr7QsQ2oPMGADkDr603RaQoM13J43prnJxeTnHgnQNhqoe
Aw/19Y8hUyqKJ6ko1PwWCOibmu/oAnEJVR/BeuPD24mIXTqHUDg5RustKiuV7vgD
qD2B1rmZCnls1Liu6Ci4Q56kuC/gedtGOlffc4zYslGyN+MqQyaRbjfqg7gL5l/l
MZamqIcebI3vaWB6d7BvrnJJJVZaTtWYTzdt7btnHcUwDeTrk333GHIJZy2UJjvN
BIgNTmIgrewRKshQfGyx69VLh+eeCrZ+xhlkONtsdrqJs6kCqX4G6+sxAo638a73
h+cYD6+O6yZOD/4XbxbrpfL8WL6vSApjswMPG8jS9ExtTwgR9yoCFoW8cwFdLAUw
mbQaoMHBL83ZiJDr69qEld0d2GDnZUYHTFFyi7NKYch/VnXbsds6N2Bi2NoNb0CD
6ABaG3HaGF2OfQssGKViDM366Jnmki1/1o3SyvFizLns4ZlCo/NXpakyFfseFKrC
7SyHP2mv8YFq/n1VvsL1YL7lhWb3gxqA+yqmkbsDpy2HToHx03RoL7h3r4tN6WyT
TI14gZ0jx934x1lYjasVx3qnGlRQDjOMlYDp41/YVLqQarJX5kpuUOwwBpubPHti
L6bYnkaTytZ/CKR5P2O42qSUMXyY4u2G/oMURukjSB2xZn0+O3BVwjLkx4IsDkCC
cGcygSV1b21CGAuTLDNwPTHTTkl1BzebfHcvkT5TKbNvMDpsKP1Ge5u26uZrhOg2
c+UtLmMU1jroYhJd+qdG7T1w3lbKkyqABbP4HNOCbunDJwHmLFz3414SSxlQHHA7
DBFGu9E1yHXUleshyYq3Tr+Vkod1BptwHvTkvNIPsAKRPZoTAFT0lM7JUE/+P7KF
qlVdguCREQBt6IRL1s8SZdAZp9g/dDljm0SzTgHmSmGkMmNB87cn7nz+VF/7wKMG
KpW28cisUQsOt5NyboJXzFp1YYu2XOPXb9wzP2rj2JyFX9tMy4SzBU373n3J0d4d
5XKg6OYMqXGZuouNBfpd7CvqBJa3K7i5pso3ZIaQ797ZUH/Dq0XRNK9/KZ8G4MXc
BZJOWqBDZp3jQEk0husuE4/Q1jzf+mInfirl9fSNKewKHjsY8PlaeiFWfOuLm7lp
XW/ToHlcVT74c6wVtyZH/OA9M/GsIPJH0rTusT/2MwW/ajlFWPqK7ePGRr/KiB7g
05PZx+6FV8LmQ+SVNCchvoicxjf2O5E2RZsf7RwznVVCiWjy2/aScG02GQTX3f4q
3U+tMx+KhyG14cChq/K3eAuX71EKHpZrK3mbud8ao1+0KWOkXKtaxtWX96N6ek8d
T8mBr83IZ8bx7Ra6tiaYtWWiNf1TVqVhdx7LMDJYwRSq
-----END ENCRYPTED PRIVATE KEY-----`;
const privateKey = forge.pki.decryptRsaPrivateKey(key, '123');

// Convert the private key to a PKCS#8 ASN.1 structure
const privateKeyInfo = forge.pki.wrapRsaPrivateKey(privateKey);
const privateKeyDer = forge.asn1.toDer(privateKeyInfo).getBytes();

// Convert DER to ArrayBuffer
const privateKeyBuffer = new Uint8Array(privateKeyDer.length);
for (let i = 0; i < privateKeyDer.length; i++) {
  privateKeyBuffer[i] = privateKeyDer.charCodeAt(i);
}

crypto.subtle.importKey(
    "pkcs8", // PKCS#8 format for private keys
    privateKeyBuffer.buffer,
    {
      name: "RSASSA-PKCS1-v1_5",
      hash: "SHA-256",
    },
    false,
    ["sign"]
).then((privateKey) => {
  console.log(privateKey)
});

^ here on line where I call wrapRsaPrivateKey I'm getting

TypeError: Cannot read properties of undefined (reading 'length')
    at util.ByteStringBuffer.putBytes (/Users/gostrolucky/Documents/xxx/node_modules/node-forge/lib/util.js:288:41)
    at asn1.toDer (/Users/gostrolucky/Documents/xxx/node_modules/node-forge/lib/asn1.js:711:15)

private key was generated with openssl genrsa -passout pass:123 -aes256

主要言語
JavaScript
スター
5.4k
フォーク
875
平均マージ
3分
マージ済み PR(30日)
6

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

digitalbazaar/forge のほかの issue

digitalbazaar/forge の issue をすべて見る

似ている issue

JavaScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。