Search code examples
gopublic-key-encryptiongnupgpgpopenpgp

PGP key armored encoding in Go's openpgp package


I am trying to print a PGP public key in an ASCII armored encoding using Go's openpgp/armor package.

The output I would expect:

-----BEGIN PGP PUBLIC KEY BLOCK-----

<base64 encoded bytes of public key>
<checksum>
-----END PGP PUBLIC KEY BLOCK-----

The output I get:

-----BEGIN PGP PUBLIC KEY BLOCK-----

<first part of base64 encoded bytes of public key>

It only prints the first part of the public key.

The public key is obtained from a local keyring file and processed as follows:

keyRingFileBuffer, err := os.Open(keyRingFilePath)
if err != nil {
    log.Fatal(err)
}
defer keyRingFileBuffer.Close()

keyRing,err := openpgp.ReadKeyRing(keyRingFileBuffer)
if err != nil {
    log.Fatal(err)
}

for _, k := range keyRing {
    w, _ := armor.Encode(os.Stdout, openpgp.PublicKeyType, nil)
    k.PrimaryKey.Serialize(w)
}

Am I using the package incorrectly? Any ideas on how to track the reason for this (in my opinion) wrong output?


Solution

  • Whoops, after putting a bounty on the question I found an answer. Oh well.

    The armor writer must be closed in order to add that end line.

    pubKeyBuf := bytes.NewBuffer(nil)
    pubKeyWriter, err := armor.Encode(pubKeyBuf, openpgp.PublicKeyType, nil)
    checkIfError(err)
    err = e.Serialize(pubKeyWriter)
    pubKeyWriter.Close()
    checkIfError(err)