chore(openvpn/extract): simplify PEM extract

This commit is contained in:
Quentin McGaw
2023-04-01 16:57:09 +00:00
parent 4ba159e483
commit c7a841f4b4
2 changed files with 14 additions and 15 deletions

View File

@@ -1,33 +1,23 @@
package extract package extract
import ( import (
"encoding/base64"
"encoding/pem" "encoding/pem"
"errors" "errors"
"regexp" "fmt"
"strings"
) )
var ( var (
errPEMDecode = errors.New("cannot decode PEM encoded block") errPEMDecode = errors.New("cannot decode PEM encoded block")
) )
var (
regexPEMBegin = regexp.MustCompile(`-----BEGIN [A-Za-z ]+-----`)
regexPEMEnd = regexp.MustCompile(`-----END [A-Za-z ]+-----`)
)
func PEM(b []byte) (encodedData string, err error) { func PEM(b []byte) (encodedData string, err error) {
pemBlock, _ := pem.Decode(b) pemBlock, _ := pem.Decode(b)
if pemBlock == nil { if pemBlock == nil {
return "", errPEMDecode return "", fmt.Errorf("%w", errPEMDecode)
} }
encodedBytes := pem.EncodeToMemory(pemBlock) der := pemBlock.Bytes
encodedData = string(encodedBytes) encodedData = base64.StdEncoding.EncodeToString(der)
encodedData = strings.ReplaceAll(encodedData, "\n", "")
beginPrefix := regexPEMBegin.FindString(encodedData)
encodedData = strings.TrimPrefix(encodedData, beginPrefix)
endPrefix := regexPEMEnd.FindString(encodedData)
encodedData = strings.TrimSuffix(encodedData, endPrefix)
return encodedData, nil return encodedData, nil
} }

View File

@@ -1,6 +1,7 @@
package extract package extract
import ( import (
"bytes"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@@ -24,6 +25,14 @@ func Test_PEM(t *testing.T) {
errWrapped: errPEMDecode, errWrapped: errPEMDecode,
errMessage: "cannot decode PEM encoded block", errMessage: "cannot decode PEM encoded block",
}, },
"valid data with extras": {
b: bytes.Join([][]byte{
{1, 2, 3},
[]byte(validCertPEM),
{4, 5, 6},
}, []byte("\n")),
encodedData: validCertData,
},
"valid data": { "valid data": {
b: []byte(validCertPEM), b: []byte(validCertPEM),
encodedData: validCertData, encodedData: validCertData,