...

パッケージ pem

import "encoding/pem"
概要
目次

概要 ▾

pem パッケージは,Privacy Enhanced Mail で始まった PEM データエンコードを実装します。 現在,PEM エンコードの最も一般的な使用例は,TLS 鍵と証明書です。 RFC 1421 をご覧ください。

func Encode

func Encode(out io.Writer, b *Block) error

Encode は, b の PEM エンコーディングを out に書き込みます。

コード:

block := &pem.Block{
    Type: "MESSAGE",
    Headers: map[string]string{
        "Animal": "Gopher",
    },
    Bytes: []byte("test"),
}

if err := pem.Encode(os.Stdout, block); err != nil {
    log.Fatal(err)
}

出力:

-----BEGIN MESSAGE-----
Animal: Gopher

dGVzdA==
-----END MESSAGE-----

func EncodeToMemory

func EncodeToMemory(b *Block) []byte

EncodeToMemory は b の PEM エンコーディングを返します。

b に無効なヘッダがあり,エンコードできない場合, EncodeToMemory は nil を返します。 このエラーケースに関する詳細を報告することが重要な場合は, 代わりに Encode を使用してください。

type Block

Block (ブロック) は, PEM エンコード構造を表します。

エンコードされた形式は次のとおりです。

-----BEGIN Type-----
ヘッダー
base64 エンコードバイト
-----END Type-----

ここで,ヘッダーは キー: 値 からなる行のシーケンスです。空かもしれません。

type Block struct {
    Type    string            // プリアンブルから取られた型 (すなわち "RSA PRIVATE KEY") 。
    Headers map[string]string // オプションのヘッダー
    Bytes   []byte            // 内容のデコードされたバイト通常, DER エンコードの ASN.1 構造。
}

func Decode

func Decode(data []byte) (p *Block, rest []byte)

Decode (デコード) は,入力の次の PEM フォーマットのブロック (証明書,秘密鍵など) を見つけます。 そのブロックと入力の残りの部分を返します。 PEM データが見つからない場合, p は nil で,入力全体が rest として返されます。

コード:

var pubPEMData = []byte(`
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlRuRnThUjU8/prwYxbty
WPT9pURI3lbsKMiB6Fn/VHOKE13p4D8xgOCADpdRagdT6n4etr9atzDKUSvpMtR3
CP5noNc97WiNCggBjVWhs7szEe8ugyqF23XwpHQ6uV1LKH50m92MbOWfCtjU9p/x
qhNpQQ1AZhqNy5Gevap5k8XzRmjSldNAFZMY7Yv3Gi+nyCwGwpVtBUwhuLzgNFK/
yDtw2WcWmUU7NuC8Q6MWvPebxVtCfVp/iQU6q60yyt6aGOBkhAX0LpKAEhKidixY
nP9PNVBvxgu3XZ4P36gZV6+ummKdBVnc3NqwBLu5+CcdRdusmHPHd5pHf4/38Z3/
6qU2a/fPvWzceVTEgZ47QjFMTCTmCwNt29cvi7zZeQzjtwQgn4ipN9NibRH/Ax/q
TbIzHfrJ1xa2RteWSdFjwtxi9C20HUkjXSeI4YlzQMH0fPX6KCE7aVePTOnB69I/
a9/q96DiXZajwlpq3wFctrs1oXqBp5DVrCIj8hU2wNgB7LtQ1mCtsYz//heai0K9
PhE4X6hiE0YmeAZjR0uHl8M/5aW9xCoJ72+12kKpWAa0SFRWLy6FejNYCYpkupVJ
yecLk/4L1W0l6jQQZnWErXZYe0PNFcmwGXy1Rep83kfBRNKRy5tvocalLlwXLdUk
AIU+2GKjyT3iMuzZxxFxPFMCAwEAAQ==
-----END PUBLIC KEY-----
and some more`)

block, rest := pem.Decode(pubPEMData)
if block == nil || block.Type != "PUBLIC KEY" {
    log.Fatal("failed to decode PEM block containing public key")
}

pub, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Got a %T, with remaining data: %q", pub, rest)

出力:

Got a *rsa.PublicKey, with remaining data: "and some more"