71fb1a0c3a0c3d9cf9076f73cd122fc840932f5f
[iotivity.git] / cloud / account / src / main / java / org / iotivity / cloud / accountserver / x509 / cert / CSRParser.java
1 /*
2  * //******************************************************************
3  * //
4  * // Copyright 2016 Samsung Electronics All Rights Reserved.
5  * //
6  * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7  * //
8  * // Licensed under the Apache License, Version 2.0 (the "License");
9  * // you may not use this file except in compliance with the License.
10  * // You may obtain a copy of the License at
11  * //
12  * //      http://www.apache.org/licenses/LICENSE-2.0
13  * //
14  * // Unless required by applicable law or agreed to in writing, software
15  * // distributed under the License is distributed on an "AS IS" BASIS,
16  * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * // See the License for the specific language governing permissions and
18  * // limitations under the License.
19  * //
20  * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21  */
22 package org.iotivity.cloud.accountserver.x509.cert;
23
24 import org.bouncycastle.asn1.x500.AttributeTypeAndValue;
25 import org.bouncycastle.asn1.x500.X500Name;
26 import org.bouncycastle.openssl.PEMException;
27 import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
28 import org.bouncycastle.operator.OperatorCreationException;
29 import org.bouncycastle.operator.jcajce.JcaContentVerifierProviderBuilder;
30 import org.bouncycastle.pkcs.PKCS10CertificationRequest;
31 import org.bouncycastle.pkcs.PKCSException;
32 import org.iotivity.cloud.util.Log;
33
34 import java.io.IOException;
35 import java.security.PublicKey;
36
37 import static org.bouncycastle.asn1.x500.style.BCStyle.CN;
38 import static org.iotivity.cloud.accountserver.resources.credprov.cert.CertificateConstants.SECURITY_PROVIDER;
39
40 /**
41  * Class is used for parsing CSR requests.
42  */
43 public class CSRParser {
44
45     /**
46      * PKCS10CertificationRequest attribute.
47      */
48     private final PKCS10CertificationRequest mCsr;
49
50     /**
51      * Certificate subject.
52      */
53     private final X500Name subject;
54
55     /**
56      * Creates CSRParser instance with specified csrDer byte array.
57      *
58      * @param csrDer specified byte array.
59      */
60     public CSRParser(byte[] csrDer) throws IOException {
61         mCsr = new PKCS10CertificationRequest(csrDer);
62         subject = mCsr.getSubject();
63     }
64
65     /**
66      * Returns public key
67      */
68     public PublicKey getPublicKey() {
69         PublicKey publicKey = null;
70         try {
71             publicKey = new JcaPEMKeyConverter().setProvider(SECURITY_PROVIDER).
72                     getPublicKey(mCsr.getSubjectPublicKeyInfo());
73         } catch (PEMException e) {
74             Log.e(e.getMessage());
75         }
76         return publicKey;
77     }
78
79     /**
80      * Verifies signature from this CSR request with help of
81      *
82      * @return true if signature is correct and false otherwise.
83      */
84     public boolean isSignatureValid() {
85         boolean condition = false;
86         try {
87             condition = mCsr.isSignatureValid(new JcaContentVerifierProviderBuilder()
88                     .setProvider(SECURITY_PROVIDER).build(mCsr.getSubjectPublicKeyInfo()));
89         } catch (OperatorCreationException | PKCSException e) {
90             Log.e(e.getMessage());
91         }
92         return condition;
93     }
94
95     /**
96      * Returns common name from csr subject.
97      */
98     public String getCommonName() {
99         AttributeTypeAndValue rdn = subject.getRDNs(CN)[0].getFirst();
100         if (rdn != null) {
101             return rdn.getValue().toString();
102         }
103         return null;
104     }
105
106     /**
107      * Returns subject as X500Name.
108      */
109     public X500Name getSubject() {
110         return subject;
111     }
112 }