Removing AAF references from Cert-Service in OOM repo.
[oom/platform/cert-service.git] / certService / src / main / java / org / onap / oom / certservice / certification / CsrModelFactory.java
1 /*
2  * ============LICENSE_START=======================================================
3  * PROJECT
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 org.onap.oom.certservice.certification;
22
23 import java.util.Base64;
24 import java.util.Objects;
25 import java.util.Optional;
26
27 import org.bouncycastle.pkcs.PKCS10CertificationRequest;
28 import org.bouncycastle.util.io.pem.PemObject;
29 import org.onap.oom.certservice.certification.exception.CsrDecryptionException;
30 import org.onap.oom.certservice.certification.exception.DecryptionException;
31 import org.onap.oom.certservice.certification.exception.KeyDecryptionException;
32 import org.onap.oom.certservice.certification.model.CsrModel;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35 import org.springframework.stereotype.Service;
36
37
38 @Service
39 public class CsrModelFactory {
40
41     private final PemObjectFactory pemObjectFactory
42             = new PemObjectFactory();
43     private final Pkcs10CertificationRequestFactory certificationRequestFactory
44             = new Pkcs10CertificationRequestFactory();
45
46
47     public CsrModel createCsrModel(StringBase64 csr, StringBase64 privateKey)
48             throws DecryptionException {
49         PKCS10CertificationRequest decodedCsr = decodeCsr(csr);
50         PemObject decodedPrivateKey = decodePrivateKey(privateKey);
51         return new CsrModel.CsrModelBuilder(decodedCsr, decodedPrivateKey).build();
52     }
53
54     private PemObject decodePrivateKey(StringBase64 privateKey)
55             throws KeyDecryptionException {
56
57         return privateKey.asString()
58                 .flatMap(pemObjectFactory::createPemObject)
59                 .orElseThrow(
60                         () -> new KeyDecryptionException("Incorrect Key, decryption failed")
61                 );
62     }
63
64     private PKCS10CertificationRequest decodeCsr(StringBase64 csr)
65             throws CsrDecryptionException {
66         return csr.asString()
67                 .flatMap(pemObjectFactory::createPemObject)
68                 .flatMap(certificationRequestFactory::createPkcs10CertificationRequest)
69                 .orElseThrow(
70                         () -> new CsrDecryptionException("Incorrect CSR, decryption failed")
71                 );
72     }
73
74     public static class StringBase64 {
75         private final String value;
76         private final Base64.Decoder decoder = Base64.getDecoder();
77         private static final Logger LOGGER = LoggerFactory.getLogger(StringBase64.class);
78
79         public StringBase64(String value) {
80             this.value = value;
81         }
82
83         public Optional<String> asString() {
84             try {
85                 String decodedString = new String(decoder.decode(value));
86                 return Optional.of(decodedString);
87             } catch (RuntimeException e) {
88                 LOGGER.error("Exception occurred during decoding:", e);
89                 return Optional.empty();
90             }
91         }
92
93         @Override
94         public boolean equals(Object otherObject) {
95             if (this == otherObject) {
96                 return true;
97             }
98             if (otherObject == null || getClass() != otherObject.getClass()) {
99                 return false;
100             }
101             StringBase64 that = (StringBase64) otherObject;
102             return Objects.equals(value, that.value);
103         }
104
105         @Override
106         public int hashCode() {
107             return value.hashCode();
108         }
109     }
110
111 }
112
113