go_sysutils/cryptparse/funcs_pemblocks.go

90 lines
2.0 KiB
Go
Raw Normal View History

package cryptparse
import (
`bytes`
`encoding/pem`
)
// Bytes returns a combined PEM bytes of all blocks in a PemBlocks. Any nil, empty, or otherwise invalid blocks are skipped.
func (p *PemBlocks) Bytes() (combined []byte) {
var err error
var buf *bytes.Buffer = new(bytes.Buffer)
for _, block := range p.Split() {
if block == nil || block.Bytes == nil || block.Type == "" {
continue
}
// We've ruled out "contextual" errors, so we ignore it here.
if err = pem.Encode(buf, block); err != nil {
continue
}
}
combined = buf.Bytes()
_ = err
return
}
// BytesStrict is like Bytes but is much more strict/safe (invalid/empty/nil blocks are not skipped) and will return any errors on encoding.
func (p *PemBlocks) BytesStrict() (combined []byte, err error) {
var buf *bytes.Buffer = new(bytes.Buffer)
for _, block := range p.Split() {
if err = pem.Encode(buf, block); err != nil {
return
}
}
combined = buf.Bytes()
return
}
// BytesSplit returns separate PEM bytes of each block in a PemBlocks. Any nil, empty, or otherwise invalid blocks are skipped.
func (p *PemBlocks) BytesSplit() (pems [][]byte) {
var b []byte
for _, block := range p.Split() {
if block == nil || block.Bytes == nil || block.Type == "" {
continue
}
// We've ruled out "contextual" errors, so we ignore it here.
b = pem.EncodeToMemory(block)
pems = append(pems, b)
}
return
}
// BytesSplitStrict is like BytesSplit but is much more strict/safe (invalid/empty/nil blocks are not skipped) and will return any errors on encoding.
func (p *PemBlocks) BytesSplitStrict() (pems [][]byte, err error) {
var buf *bytes.Buffer = new(bytes.Buffer)
for _, block := range p.Split() {
buf.Reset()
if err = pem.Encode(buf, block); err != nil {
return
}
pems = append(pems, buf.Bytes())
}
return
}
// Split returns a more primitive-friendly representation of a PemBlocks.
func (p *PemBlocks) Split() (native []*pem.Block) {
if p == nil {
return
}
native = *p
return
}