Функция pem.Encode

Функция pem.Encode кодирует переданные данные в формат PEM, который широко используется для представления криптографических ключей, сертификатов и других данных в текстовом виде. В первый параметр функция принимает объект io.Writer, куда будет записан результат, во второй параметр - структуру pem.Block, содержащую тип заголовка и байтовые данные для кодирования.

Синтаксис

gopem.Encode(w io.Writer, b *pem.Block) error

Пример

Давайте закодируем простые байтовые данные в формат PEM:

gopackage main

import (
  "bytes"
  "encoding/pem"
  "fmt"
)

func main() {
  data := []byte("Hello, PEM!")
  block := &pem.Block{
    Type:  "MESSAGE",
    Bytes: data,
  }
  buf := new(bytes.Buffer)
  err := pem.Encode(buf, block)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(buf.String())
}

Результат выполнения кода:

go"-----BEGIN MESSAGE-----\nSGVsbG8sIFBFTSE=\n-----END MESSAGE-----\n"

Пример

Давайте закодируем данные с использованием нескольких блоков PEM:

gopackage main

import (
  "bytes"
  "encoding/pem"
  "fmt"
)

func main() {
  data1 := []byte("First block")
  data2 := []byte("Second block")
  block1 := &pem.Block{
    Type:  "BLOCK1",
    Bytes: data1,
  }
  block2 := &pem.Block{
    Type:  "BLOCK2",
    Bytes: data2,
  }
  buf := new(bytes.Buffer)
  err := pem.Encode(buf, block1)
  if err != nil {
    fmt.Println(err)
    return
  }
  err = pem.Encode(buf, block2)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(buf.String())
}

Результат выполнения кода:

go"-----BEGIN BLOCK1-----\nRmlyc3QgYmxvY2s=\n-----END BLOCK1-----\n-----BEGIN BLOCK2-----\nU2Vjb25kIGJsb2Nr\n-----END BLOCK2-----\n"

Пример

Давайте закодируем данные с использованием пользовательских заголовков:

gopackage main

import (
  "bytes"
  "encoding/pem"
  "fmt"
)

func main() {
  data := []byte("Custom headers data")
  block := &pem.Block{
    Type:  "CUSTOM",
    Headers: map[string]string{
      "Version": "1.0",
      "Author":  "Developer",
    },
    Bytes: data,
  }
  buf := new(bytes.Buffer)
  err := pem.Encode(buf, block)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(buf.String())
}

Результат выполнения кода:

go"-----BEGIN CUSTOM-----\nVersion: 1.0\nAuthor: Developer\n\nQ3VzdG9tIGhlYWRlcnMgZGF0YQ==\n-----END CUSTOM-----\n"

Смотрите также

  • функцию pem.Decode,
    которая декодирует PEM-данные обратно в блок
  • функцию pem.EncodeToMemory,
    которая кодирует данные в PEM и возвращает их в виде среза байтов
  • функцию x509.MarshalPKCS1PrivateKey,
    которая преобразует приватный ключ в PKCS1 формат
  • пакет crypto/x509,
    который содержит функции для работы с сертификатами и ключами