[OOM-K8S-CERT-EXTERNAL-PROVIDER] Format golang code
[oom/platform/cert-service.git] / certServiceK8sExternalProvider / src / x509 / x509_utils.go
1 /*
2  * ============LICENSE_START=======================================================
3  * oom-certservice-k8s-external-provider
4  * ================================================================================
5  * Copyright (C) 2020 Nokia. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package x509
22
23 import (
24         "bytes"
25         "crypto/x509"
26         "encoding/pem"
27         "fmt"
28 )
29
30 const (
31         PemCsrType        = "CERTIFICATE REQUEST"
32         pemPrivateKeyType = "PRIVATE KEY"
33 )
34
35 // decodeCSR decodes a certificate request in PEM format
36 func DecodeCSR(data []byte) (*x509.CertificateRequest, error) {
37         block, err := decodePemBlock(data, PemCsrType)
38         if err != nil {
39                 return nil, fmt.Errorf("error decoding CSR PEM: %v", err)
40         }
41         csr, err := x509.ParseCertificateRequest(block.Bytes)
42         if err != nil {
43                 return nil, fmt.Errorf("error parsing certificate request: %v", err)
44         }
45         if err := csr.CheckSignature(); err != nil {
46                 return nil, fmt.Errorf("error checking certificate request signature: %v", err)
47         }
48         return csr, nil
49 }
50
51 func DecodePrivateKey(data []byte) (interface{}, error) {
52         block, err := decodePemBlock(data, pemPrivateKeyType)
53         if err != nil {
54                 return nil, fmt.Errorf("error decoding Private Key PEM: %v", err)
55         }
56         key, err := x509.ParsePKCS8PrivateKey(block.Bytes)
57         if err != nil {
58                 return nil, fmt.Errorf("error parsing Private Key: %v", err)
59         }
60         return key, nil
61 }
62
63 func decodePemBlock(data []byte, pemType string) (*pem.Block, error) {
64         block, rest := pem.Decode(data)
65         if block == nil || len(rest) > 0 {
66                 return nil, fmt.Errorf("unexpected PEM")
67         }
68         if block.Type != pemType {
69                 return nil, fmt.Errorf("PEM is not: %s", pemType)
70         }
71         return block, nil
72 }
73
74 func ParseCertificateArrayToBytes(certificateArray []string) ([]byte, error) {
75         buffer := bytes.NewBuffer([]byte{})
76         for _, cert := range certificateArray {
77                 block, _ := pem.Decode([]byte(cert))
78                 err := pem.Encode(buffer, &pem.Block{Type: "CERTIFICATE", Bytes: block.Bytes})
79                 if err != nil {
80                         return nil, err
81                 }
82         }
83         return buffer.Bytes(), nil
84 }