Ошибка EOF при чтении ключей PGP из JSON Golang - PullRequest
1 голос
/ 20 марта 2019

Я разрабатываю API с использованием Golang, и у меня есть файл JSON keys.json следующим образом:

{
  "publicKeys": {
    "Flex": "<valid pgp public key>",
    "Flex2": "<valid pgp public key>"
  },
  "privateKey": "<valid pgp private key>"
}

Чтобы разобрать это, у меня есть следующая модель

type PGPKeys struct {
    PublicKeys map[string]string `json:"publicKeys"`
    PrivateKey string            `json:"privateKey"`
}

и я отменяю код, используя

keysJSONFile, err := os.Open(keysPath)
    if keysJSONFile != nil {
        defer keysJSONFile.Close()
    }
    if err != nil {
        return nil, err
    }

    keysJSONBytes, err := ioutil.ReadAll(keysJSONFile)
    if err != nil {
        return nil, err
    }

    var pgpKeys PGPKeys
    err = json.Unmarshal(keysJSONBytes, &pgpKeys)
    if err != nil {
        return nil, err
    }

Позже, когда я использую openpgp для получения пакета открытого ключа, меня встречает ошибка EOF, которая armor.Decode возвращает, когда не удается найти какие-либо блоки - но я не уверен, почему это происходит

func GetPublicKeyPacket(publicKey []byte) (*packet.PublicKey, error) {
    publicKeyReader := bytes.NewReader(publicKey)
    block, err := armor.Decode(publicKeyReader)
    if err != nil {
        return nil, err
    }

    if block.Type != openpgp.PublicKeyType {
        return nil, errors.New("Invalid public key data")
    }

    packetReader := packet.NewReader(block.Body)
    pkt, err := packetReader.Next()
    if err != nil {
        return nil, err
    }

    key, ok := pkt.(*packet.PublicKey)
    if !ok {
        return nil, err
    }
    return key, nil
}

ПРИМЕЧАНИЕ: Когда я вызываю функцию, я выполняю преобразование типов, используя что-то вроде

publicKeyPacket, err := pgp.GetPublicKeyPacket([]byte(h.PGPKeys.PublicKeys[h.Config.PGPIdentifier]))

Наконец, я попытался переместить ключи в отдельные файлы TXT и , который работает , но по какой-то причине наличие их в JSON не

1 Ответ

0 голосов
/ 20 марта 2019

Я нашел решение этой проблемы, пытаясь что-то случайным образом, и я удивлен так же, как и вы (будущий читатель ответов). Если кто-то может дать объяснение, я был бы благодарен.

Я хранил ключи в JSON, заменив все символы новой строки на "\ n", чтобы я мог хранить их в одной строке. Вы знаете, как ключи PGP имеют пустую строку сразу после -----BEGIN PGP PUBLIC KEY BLOCK-----? Ну, в моем файле у меня было что-то вроде

"publicKeys": {
    "Flex": "-----BEGIN PGP PUBLIC KEY BLOCK-----\nQfdsf...."
}

Добавление этой дополнительной пустой строки, т.е. изменение ее на

"publicKeys": {
    "Flex": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nQfdsf...."
}

РЕДАКТИРОВАТЬ: Как упомянул @Adrian в комментариях, это произошло потому, что это недопустимый ключ PGP, если линия больше не существует в соответствии со спецификацией RFC. Так и должно быть.

...