Ошибка EOF при чтении ключей PGP из JSON Golang

#json #go #openpgp

#json #Вперед #openpgp

Вопрос:

Я разрабатываю 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, amp;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]))
  

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

Ответ №1:

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

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

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

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

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

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

Комментарии:

1. «Каким-то образом» могло бы быть: приведение значения, которое вы предоставляете, в соответствие с форматом, ожидаемым для ключа.

2. Но я выполняю преобразование типов. Также, когда он считывает из json, он все еще читается как текст.

3. Я не говорю, что это неправильный тип переменной или что это не текст. Ожидаемый формат ключа включает две новые строки после заголовка, у вас была одна. В вашем ответе говорится, что изменение «каким-то образом исправило это», как будто это было загадкой, но на самом деле вы только что исправили свои входные данные, чтобы они соответствовали указанному формату для этих данных. Более подробную информацию об ожидаемом формате данных вы можете найти в RFC4880, раздел 7 .

4. Понятно, большое спасибо за это разъяснение. Мне никогда не приходило в голову, что отсутствие дополнительной строки может сделать недействительным весь ключ.