Openpgpjs: Exception Misformed armored text

Created on 18 Mar 2019  路  8Comments  路  Source: openpgpjs/openpgpjs

When I tried to encrypt a message using a public key (that I copied below in the code), I have the following exception in the browser:
_TypeError: Error encrypting message: Cannot read property 'isPublic' of undefined_

When I debugging the code, to see in which part of the code throw this exception, I found that exception is thrown by the class encoding_armor.js, dearmor method and line 226. The error happens because the last line of the public key is undefined or blank:
if (lineUntrimmed === undefined) { throw new Error('Misformed armored text'); }

I reviewed and validate that the public key has the correct format, but the error persist.

I share my code that I used:

import * as openpgp from 'openpgp'
export class OpenpgpComponent implements OnInit {

privateKey = '-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: OpenPGP.js v4.4.10
Comment: https://openpgpjs.org
xcaGBFyPFq4BEAC4vH6oEfCFk8c+ejYZKAobA3OM9qQPV5j/8yO/HSWT8xxp
yAk7SI/5HyBhHG1gkgg2Qt+veiveVxxqS0Pd3VbHl7Z9iqeeIzb9ezKhn/Xz
mBQKlsWMpfco42fmRwMhD/UP/5ABaqYk8nsdWCcgR5MWAmmgWtAC2qawLJJZ
mGXOwxOg8Bx0B1oXyfRIftfPllFewJsrsIABPyIcJEVMbWkLKCyhzOhgBa+9
YdursmWg6NYt9bpSQn8AecXyuQ+GcRfnPtm+cSS7YbXskC4sbcHQ5NR0rgMZ
t2GgpXR+4xxoNwuGADikQwgosiwPNSpKzZhK6Abz3h+qTANFvi+XrqQQxpd+
2yKrVbqb7Fs1MTUB/2ekvx2/8Ex0oFrchjtdCyQuXmLY2ep2JAvpHwMtirg7
d+TMTVi1zGzu2s49PVty6uQ2Y6ToP3pXOndG0I4n29MzJRpaM9uDXDdEZMDl
uhJKY3z5Zhl888EadNTBbb0jnMctP0OXhzXr06j4OwThwcIQ3Bzg+2CrtQPG
ilSzqq5xPHSznopko6g3Ge2b/+rERdGbTEAtUmB3CUlO4TanWLu9QCvsXOru
jYJF425k1XDsCyrWd+KwnKJEsZ5WTvXI/9Z+eghZTZ9qNBjmaK8i46XZPdDK
gg9jpRfXaj9OvD7PbEs8QoF9xrAXT75Ic8a6TwARAQAB/gkDCOggj3ldHal6
4C3LKeR2cI4OEbkEVmy+CfzQt8oSHz/X9OP5SdK5YCnLCqLKneMAJcJ6Qnge
YZ7eUKW+f7dQuNoUVtW2faJIIqYXzjUXFCFc/Zbu2WnKWN9xNFkIQwQYr8wn
R7qS7Ikd1qFs3Q49y9z9WLWIBzW6WGuqXg2q797ZZIaal4u3w99QEis8uP1u
6e+LEiZsP8gaSn0P2gEXG+VJRhMtJGxKeemkM5eGwRw/BMF3w5sMGSKuw0Ig
X/nqCIRxke3AY0+NOgjrQnhI7Q9iiDVSpmDscUMht0nGTF1YsJszuTMu5YIn
U0svRFZzllGQxAUD9V3VGLuDWA2p0Qxnss9DcsyJcUTdRuUFwhWj2Z3qqaOi
d6c3rsfeWoHTOvMux2n6OO3H02XFlsQPtRs5x7hJqd1EIcm4cfnsVRmTOy+z
raPuHckITWVj9gNWP99jqvpZS/cta+7C6dqh3XXQMf/9TFUWGohS+J8n4kyW
nX1AFikNAKgJngD195gczJVzq8+8ap5RWGNVsuNMUNnirAaVQSycF7h0Paw4
f950U6JQasgqjBp0kuGDdrdJz/rz9crdpiq7Ua+8DPX1vAoEb8fTPGgMdMGH
7V49T6P8R0Sbmc1GHqipsBzGVg8V6RS0wRuD5TfMGkpAR07EsOrP/Z7MiXpY
Au0GDmMBd7obMPEk6T+BIwWtMdYP+0npqX8XrQjgxkfB7Ww/MH3/nf0dAANL
ua8BtpxZD2k0lhL4H2Nd+X1fJ+24pX2+n8hw1orsD4KYt/tT9jOJYZQyF61I
DNMFrvp810ce/HKaZPJ+bCBD58Tibi2wL2LKzqYMKqG96OvDuUlRJmsf/cHF
HBi7yAJnGB6MGFV0DbYgMaYhh1rDMqCUDPKN4/FOThKV1GGbfNw3riMFgP3s
zqIOPQOULoXyLYD7hh47fVjSyZY+5Fpo7SaJVAaaop5kwAU9AHPnhQCPpCf5
V9z7BPoFgnojrsRBTDOBQOH8L7Dbr3f5xRsFADXPKSciCKkRsgrfmuymZ8Mu
WfGSIUltm6C3W1qkonshZANooFQjn4Kwm+CMzeASVPmabW+UFNkctDx1bCoD
5h0V8sy3EsXPJT5ZZDqXn0EVmegqEiXpI37a21Mneah3or5WVPPcQSIzLrgy
wy+0wASN6eSrjPNViPN6GwKjwjb89KGyWiCBWiksoFh2jgC0xngXNsqnkLpM
8ceJDMlOlOrVS8sdCeOtRHW4j/shgkcYmcoPAs4m/wrGKu1fCt5StHFuKno+
bilKq7M7xnNp+TxbVE0UL9e5TFAiMNvbi209xP8AHyeRRjadmvEdyTSq1xYd
Cu6UuCATcrlUj+TbifNlzwTm2WZip2F5NOUAwTpsOwUoJHcrrfEaxMPVqZrN
IYT5yOtoY4ez3agzxfaEYVrrHobAa741t6MfP30xWe7syuczebA74d3vMVDh
3vrh2f7jsJxqE5NPZCnd7pmH2DsTxebktxi3y7fTihUNA8iYgIp5JYXBWN7X
Zs9xQZ8BtyWuD8Byy0CCFQJs5j8JRFEA7xMDS04/5waZKkxRy7IeiLynW460
S2vU9E2Hd//xm8F4UR4ChHl6IwBGCAX54hOC85nxjbSstBY17Vrp32HqLWZG
yC4nPyCH8Vw7m0iBXDwcu34GJA8jUasUiTPUIPXrCeKd4mjrnlDG2Ai2zXym
AoS26fTDvCSbpu7r+TJrBpr1rp/Gch1lA7Ea7+rfqQC0Z+KuryCaVCO5C3O7
e8b3vUQJs1lxihKduf5yTZrCQjXNG0pvbiBTbWl0aCA8am9uQGV4YW1wbGUu
Y29tPsLBdQQQAQgAHwUCXI8WrgYLCQcIAwIEFQgKAgMWAgECGQECGwMCHgEA
CgkQO38OBZe6HYdC1A//TjH4rVtLOSLa/TieJQZHY27/pMV/p0CuudjwK8D2
VohjzCvecf426L1zRYGVUzH4mvGJzHqYUe7AfU5ECQi7YsYBELc+ZxNBHvs+
o3WMb9h3PsFCCE9QLAI53z4qQo72IYejwbqdMvEn5zSgAX0g5YwqU+vBUKjG
msHVa88gdSJ1gl0iQGiDm2N154r9agP/CgUe1z+QV7jGViu445sCk3hWOlcL
3hy8OCHpJws5XZt7FvZqIQ+X6Y7n7OXqSdKAqF1ifOZQPkhKUqffib/jepWt
KxyNfpMCPwuCV8lFn30QZD7ytQrqxSTzhJzGBDvVZC6G0X/owiV9ceK/OS3n
Nhb/Mp1l697ESt1vSVtHI+q/KlK/6xfuQGg5aDZIai3wc2XSKwcaSHUllOR+
rX80LowhXpocv3bqlFiV51dhvH0n5kDDNAwqOaTlCqRgmvIOgMmqjFdE1c8A
xehdTZe6weOKfIelxTtzVfT3KJD9WqvrOVHgkKlt3czEfR0tTo8wM6yPBmYD
BPFqsyRFDIO0YGdMbNSV3PH+7/loITafSy19TkyXYNOHpETIb1GoUY7y9MPi
MkZLMdPrznvr1b2cJOr4UQLOOBnm0HuCn7ttW7PcRNd/mJ+bsAxibhXX7u25
SS3YE3sMupnd/uLX9+XREhLma7hMcpukcmh0ehwG7e3HxoYEXI8WrgEQAMrR
WI4P9/qwO08qVcZjpYwkc8PNa9XqTMEEDCyarCcExAlqm2N4LZKynhEsFk3V
6LpxBnB7hiFJElsTOJdhEStbNq33BD3i71oScKu4q7j48T8yv2OYil+WqhZs
Z3cmHksuvQJKD4nG0oCmG66WzdcKzEZOTkcSX8Chle6eebVl7FHW6SAhqdlS
B+oVHwalWvzdMVFbxzO75JAswRhQHqpq661OFtfDMiIxgoshXNBEDPJRLXue
UALi2jV10c4ArsWWcnSMmzPsNAIk2jMlXsY66G/GIp4JeWMUzW0RvBbKI3DW
4WUC/J/IeD841wa14D8yLLBCkKcIdo1mqibrkPdZt99555mALOhKDJXXWXS8
LL05ns/HcY3sTF9siH1IsEDTrtKVGnAePubyNBZo4jSE6MoLAOUNyA5GPjjH
0FirLfZWW1K6epyRQN+23CwYBXZDTcqqcX7cRr2IHMHv+HowPtRxpNcb76mA
Tb9hrayheiWQwXqOKEBlgKC2AmcN+a9GEbWYh3cA/1NQiOcrPYR38ok0y4Aa
ku255PmWOgdHEbenNtRd3YFB0WipbNSo8Dpa1CIiICm++/M/egA2uNOt209x
5/r+FBlXa798yAIzPKK/KKmFShFvNnVHeLwEJKtCe/PeCpwrYSBbCFF61C7a
F7mHEeKCvyMGAAD+0KmZABEBAAH+CQMIi/PS7bJ0vLbgfj3OE1qRmgLnEzEG
A7iPDb1RLIJw8ZL8g28yf6ZCNmBMd1t1OkMN/l3Cbj96dLHOB5Ls9o1mTw4V
lv1GGq5P94bCpDvyTP8qjmjSjKkmYApWK0wUsD8PykT3U91wtzBsnx1hTPzN
PlwQwYFvXMFfD99ZH624Fa4d8xvmoG/muBXsT/mkZqgGtUNZYEb7FrlNZrFz
0e6sXBtFHs6DmTQ+O1/pBFZJJsPSPdUfa3lpjLQPY+jVBMzRsRKzjAj6oO9s
FQKEjLvQqSIWI5G/Y6RnOSCzt0iF72GWNyglHg8q1MxxQrYHdox4fvnhiONt
TXrjkXvz3v6+rlDggYfLDq6J5NZcMfBVoGFvZp588/PrCq00kroLLfkAgfcw
AtEpRSNUk3J4i+WujdKlBIJ7GU9t0GMK++aMWQLjrjZDjJ3OmBBRN4ODtjv5
V3XB/PSFZFV6+JSyMLiAO+m4/QQARaBw91yOXy4O16kAqtUtxUzGZawWVYvc
w+nKFK2gebV5ZvOYmnLBoAIsvti3MpgCAlXmB5soQVrmYf/Tb04X9z16oNpx
hw540sEtQn2aFpbjshAMt1RQXp/OisCgOv/CCRSkbXLK5TunXB8cfLNLQu5u
zh2OldTfd8VIEFT2XN+TeLvjoU/tjNw+VYy3ogwcf4lCDO4r3mnImkHwvU3d
CfHvNok05SCJXxMAyPdF1mZfzlYFhC7jyzCSRYmfX4hK2fffv0MsutVOd4Oj
sphh+wneS13OCv+zqUul8JZDqcagGFFTCjFqUswm1hggT7kXRy2mphQ5qE6U
h0Tcj2rSgh6Wqj6X85roU1NcbMWYnJhsT9H7fhFfrXONGymdZg0VYCuhBkFV
YbTS1tbo1uMJUjxtWe+YDT/0owqIKVXWOUSLDvDyriQXwIRhDDG2f16d/j34
VXVh9nYk0Qlpd2eI8XHdy17FoSwDl+SPOVxIOzW5iUwEmN9GBMmelvlXVASE
ZaEnmUr0CPcD+ZrX5oyjG6vZLl6uWBmqyF51yJUoNeKsOiPkcNQNWQ4fmXrW
E2DcdgzB+4x8iEBYFZJRvyhbcWYplXEEQRJSMsAHQff/0B1+6FhXnvOWYcFX
oFsXG8Pc0ScQRwE5XhfVk9qPEpG4JN3IC0bd/dVG7l4YqXByf7RNsLCftXKo
6YAOdQqzwe/PVrUGcCgYHmiT+O7cNEfmgq+K+WnKxuhOT359esgllqIIkmA1
khHgUUv6PD/cjPoTz4wv5b1H4P/XTkju08wxZqDw5pkQLvV0MBMtxafCHgDp
26o25NYFel9M4oi4K06yv++cKdfiL7Ug5ei8on8DwuahZBRmqtThYQeChsN6
r1P99u095SNOqwSCFp4dJhwfZC+shLL95ex809mf7DieNTwicuxDV5h7wn60
Mx9dS3M4ulkdz5RyasPoySTtlzcAQeRQh9176iMJ4ghIp5k2u/5/+xee8G+a
GIZwBmenARQ+s09I/tav/hH+paU1RXCXW23swaDuxmORiSc8Ypa5sjM/q5mX
To7SPuX8IZOzlU1mgDLEMG0raMGWbuvIhfcG3//BD215UBIV3do1LDpnTME3
2QUEiRNxsYz1u1wV6gwDCHTD5BZmDoZWyfiau7c0ga3256tGxYoxX72lPyyA
4X2WJx9LHs6nW8RkRUX8MlU5SnNJQagSoZQPCNkyVLP7HEWNWXYfILpZrFwu
oMPD0WAqcC5/hIBPSVhjOJbxlygQbgjjKu12PrONc7/km6woC3k1ZZDE/ree
icnteEPty8LBXwQYAQgACQUCXI8WrgIbDAAKCRA7fw4Fl7odhxQwD/9z4kxb
lram6K+k2TpGQHYN3KuJMnzpRkbTYbtn2N8E49IevS8/qZCFmXLtbDxXRQtm
8ivkwqr+1iZUKdqEIxRYwVzD8ODefQmEBhuvleZa4wXUA/WuV6UmEqjW9YW8
0NoY/9W2IMtKN8i1WlYzxE1A8W4B0iEJeJpVmcP28OO+YZNci99lv31rxWuj
oL1axAz2SPbx7qKCtk+fLS+dkeaQ1px6f9UkYIaY1IPbdJkA44ZUl8Q9bt8z
iXolUnENMhTz2dDfHz1ubK/lFuxCWQMOIVhBQgYPc+HDCSp3LTxAOiFxAoUN
ssctQGZylwjV8bH/VojGYw7lyPAWpfqcgVtB8Bcj4RpGxVtD5imtzLRou9Ox
z7bd/hFZ8qlHXniw8cRHXT6TC0+DtAoYyowxfFY1ajEYRWC8Ztcu7Ku1O/iB
Y1NvhWPpi+O5YepEEnhb3jK5XvgTH1NYOQztQ5vVNCNgMqQ5bz8MKqvbLZ9E
Sdz7BjjRYjZUKj2TctTroL1itKqSceZNTeB1xUX8QIe5yTdGOPceoNZMl8iN
J3QiBKoy52AIriEkPHjARjhoUWO5EAKTPSZ164/0Hp/9oZAvfNB1dp9FTZZG
pszMpG7VdWWtpz8kKeS/CkJ0UjrhkPr4IXsE9quk85AqImI8QVT0ViprdHuu
sNE3xsCNiXEPPlNSlw==
=OqXc
-----END PGP PRIVATE KEY BLOCK-----'

ngOnInit() {
this.encryptDecryptFunction()
}
encryptDecryptFunction = async() => {
const pubKeyObj = (await openpgp.key.readArmored(this.publicKey.trim())).keys[0]

const options = {
    message: openpgp.message.fromText('Hello, World!'),
    publicKeys: [pubKeyObj]
}

console.log(options)

openpgp.encrypt(options).then(ciphertext => {
    let encrypted = ciphertext.data 
    console.log(encrypted)
    return encrypted
})

}

Do I have to make any additional settings?

error

Most helpful comment

You've indented the key, thereby adding leading whitespace. That probably breaks it.

All 8 comments

Hi @rcronald! Javascript doesn't allow single-quoted multiline strings, so I'm not sure what code you're actually running, but I suspect the newlines are somehow getting filtered out. Try quoting your string with ` instead. You're also missing a blank line after the Comment: https://openpgpjs.org line.

I have this exact same issue. I'm using valid javascript with backtick for multiline quote, so it's not a quote issue.

Hi @confusingbits! Could you post some example code or armor?

const pubkey = `-----BEGIN PGP PUBLIC KEY BLOCK-----

  mQINBF0CkssBEADoExELXOoERF5/7Rq7GdJJAEwdvILvCbEqyCXDw5rDo9dA2NZF
  ...
  =HT6x
  -----END PGP PUBLIC KEY BLOCK-----`;
const publicKeys = await openpgp.key.readArmored(pubkey);

Error: Misformed armored text
at _base2.default.decode._webStreamTools2.default.transformPair

This error shows up inside the publicKeys object. It is not thrown. And no keys are added to the key array.
Single quote usage is simply to avoid formating issues in github comments, the real code uses backticks. I get the same issue with private keys or a combination. I'm using keys generated with GPG in mac and it works correctly with other parties.

You can put code between triple backticks to fix the formatting. As is, it looks like you're missing a blank newline after the -----BEGIN PGP PUBLIC KEY BLOCK-----.

Blank newline is in the key. I removed it when creating the comment.

I guess the question is what could cause this to fail. Do I need to specify a specific key version or format somewhere so that it parses correctly? I don't know what armored text is, I'm just using the keys that I've been using elsewhere as is. I expected to just be able to paste this in and plug it into this the encrypt function with the text to encrypt. Is there another step that I'm missing?

Fixed the code formatting, thanks for the tip.

You've indented the key, thereby adding leading whitespace. That probably breaks it.

You've indented the key, thereby adding leading whitespace. That probably breaks it.

That was the issue, thanks. :)

Was this page helpful?
0 / 5 - 0 ratings