2 // Copyright (c) 2013 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file FSecPkcs_Pkcs08AttributeValueImpl.cpp
19 * @brief This is the implementation file for _Pkcs08AttributeValueImpl class.
21 * This header file contains the implementation of _Pkcs08AttributeValueImpl class.
26 #include <openssl/x509.h>
27 #include <openssl/objects.h>
28 #include <openssl/obj_mac.h>
29 #include <openssl/evp.h>
30 #include <unique_ptr.h>
31 #include <FBaseByteBuffer.h>
32 #include <FBaseResult.h>
33 #include <FBaseSysLog.h>
34 #include <FSecPkcsPkcs08Attribute.h>
35 #include <FSecPkcsPkcs08AttributeValue.h>
37 #include "FSecPkcs_PkcsUtility.h"
38 #include "FSecPkcs_Pkcs08AttributeImpl.h"
41 using namespace Tizen::Base;
43 namespace Tizen { namespace Security { namespace Pkcs
46 _Pkcs08AttributeImpl::_Pkcs08AttributeImpl(void)
51 _Pkcs08AttributeImpl::~_Pkcs08AttributeImpl(void)
57 _Pkcs08AttributeImpl::Construct(const Tizen::Base::ByteBuffer& encodedData)
64 const byte* pBuffer = null;
65 ByteBuffer asn1TypeBuffer;
66 Tizen::Base::String attrOid = null;
67 X509_ATTRIBUTE* pAttribute = null;
68 ASN1_OBJECT* pObject = null;
69 ASN1_TYPE* pAsnType = null;
71 SysAssertf(__attributeType.GetLength() <= 0, "Already constructed. Calling Construct() twice or more on a same instance is not allowed for this class.");
73 pBuffer = encodedData.GetPointer();
74 SysTryReturnResult(NID_SEC_CRYPTO, pBuffer != null, E_INVALID_ARG, "The specified input parameter is invalid.");
76 bufferLen = encodedData.GetRemaining();
77 SysTryReturnResult(NID_SEC_CRYPTO, bufferLen > 0, E_INVALID_ARG, "The specified input parameter is invalid.");
79 pAttribute = d2i_X509_ATTRIBUTE(null, reinterpret_cast< const unsigned char** >(&pBuffer), bufferLen);
80 SysTryReturnResult(NID_SEC_CRYPTO, pAttribute != null, E_INVALID_ARG, "The specified input parameter is invalid.");
82 pObject = pAttribute->object;
83 SysTryCatch(NID_SEC_CRYPTO, pObject != null, r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The specified input parameter is invalid.");
85 attrNid = OBJ_obj2nid(pObject);
86 attrOid = _PkcsUtility::ConvertToOid(attrNid);
89 SysTryCatch(NID_SEC_CRYPTO, !IsFailed(r), , r, "[%s] Failed to get the object id of an attribute.", GetErrorMessage(r));
91 __attributeType = attrOid;
93 for (int i = 0; i < X509_ATTRIBUTE_count(pAttribute); i++)
96 pAsnType = sk_ASN1_TYPE_value(pAttribute->value.set, i);
97 SysTryCatch(NID_SEC_CRYPTO, pAsnType != null, r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The specified input parameter is invalid.");
99 std::unique_ptr< Pkcs08AttributeValue > pNewObj(new (std::nothrow) Pkcs08AttributeValue());
100 SysTryCatch(NID_SEC_CRYPTO, pNewObj != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
102 value = i2d_ASN1_TYPE(pAsnType, &pTemp);
103 SysTryCatch(NID_SEC_CRYPTO, value > 0, r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The specified input parameter is invalid.");
105 r = asn1TypeBuffer.Construct(value);
106 SysTryCatch(NID_SEC_CRYPTO, !IsFailed(r), r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
108 r = asn1TypeBuffer.SetArray(pTemp, 0, value);
109 SysTryCatch(NID_SEC_CRYPTO, !IsFailed(r), r = E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The specified input parameter is invalid.");
111 asn1TypeBuffer.Flip();
113 r = pNewObj->Construct(asn1TypeBuffer);
114 SysTryCatch(NID_SEC_CRYPTO, !IsFailed(r), r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
116 r = AddAttributeValue(*pNewObj.release());
117 SysTryCatch(NID_SEC_CRYPTO, !IsFailed(r), , r, "[%s] Failed to add attribute", GetErrorMessage(r));
123 X509_ATTRIBUTE_free(pAttribute);
128 _Pkcs08AttributeImpl::Construct(const Tizen::Base::String& attrType)
130 //Variables local to function
132 SysAssertf(__attributeType.GetLength() <= 0, "Already constructed. Calling Construct() twice or more on a same instance is not allowed for this class.");
134 SysTryReturnResult(NID_SEC_CRYPTO, attrType.GetLength() > 0, E_INVALID_ARG, "[E_INVALID_ARG] The specified input parameter is invalid.");
136 //Initialize the Attribute instance with Attribute type
137 __attributeType = attrType;
145 _Pkcs08AttributeImpl::AddAttributeValue(const Pkcs08AttributeValue& value)
147 SysAssertf(__attributeType.GetLength() > 0, "Not yet constructed. Construct () should be called before use.");
149 return __attributeValues.Add(value);
153 _Pkcs08AttributeImpl::RemoveAttributeValue(const Pkcs08AttributeValue& value)
155 SysAssertf(__attributeType.GetLength() > 0, "Not yet constructed. Construct () should be called before use.");
157 return __attributeValues.Remove(value);
161 _Pkcs08AttributeImpl::GetAttributeType(void) const
163 SysAssertf(__attributeType.GetLength() > 0, "Not yet constructed. Construct () should be called before use.");
165 return __attributeType;
170 const Tizen::Base::Collection::ArrayList&
171 _Pkcs08AttributeImpl::GetAttributeValues(void) const
173 SysAssertf(__attributeType.GetLength() > 0, "Not yet constructed. Construct () should be called before use.");
175 return __attributeValues;
179 _Pkcs08AttributeImpl::GetEncodedDataN(void) const
181 result r = E_SUCCESS;
186 X509_ATTRIBUTE* pAttribute;
187 std::unique_ptr< ByteBuffer > pAttrVal;
188 std::unique_ptr< ByteBuffer > pAttributeBuffer;
189 Pkcs08TagValue tagType;
190 ASN1_TYPE* pAsn1Type = null;
191 ASN1_STRING* pString = null;
195 SysAssertf(__attributeType.GetLength() > 0, "Not yet constructed. Construct () should be called before use.");
197 pAttribute = X509_ATTRIBUTE_new();
198 SysTryReturn(NID_SEC_CRYPTO, pAttribute != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
200 attrNid = _PkcsUtility::ConvertToNid(__attributeType);
202 value = X509_ATTRIBUTE_set1_object(pAttribute, OBJ_nid2obj(attrNid));
203 SysTryCatch(NID_SEC_CRYPTO, value == 1, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] The method cannot proceed due to a severe system error.");
205 pAttribute->value.set = sk_ASN1_TYPE_new_null();
206 SysTryCatch(NID_SEC_CRYPTO, pAttribute != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
208 pAttribute->single = 0;
210 count = __attributeValues.GetCount();
211 SysTryCatch(NID_SEC_CRYPTO, count > 0, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] The method cannot proceed due to a severe system error.");
213 for (int i = 0; i < count; i++)
215 Pkcs08AttributeValue* pObj = const_cast< Pkcs08AttributeValue* >(static_cast< const Pkcs08AttributeValue* >(__attributeValues.GetAt(i)));
216 SysTryCatch(NID_SEC_CRYPTO, pObj != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] The method cannot proceed due to a severe system error.");
218 tagType = pObj->GetTag();
220 pAttrVal = std::unique_ptr< ByteBuffer >(new (std::nothrow) ByteBuffer());
221 SysTryCatch(NID_SEC_CRYPTO, pAttrVal != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
223 SysTryCatch(NID_SEC_CRYPTO, pObj->GetValue().GetRemaining() > 0, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
225 r = pAttrVal->Construct(pObj->GetValue());
226 SysTryCatch(NID_SEC_CRYPTO, !IsFailed(r), r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
228 pString = ASN1_STRING_type_new(tagType);
229 SysTryCatch(NID_SEC_CRYPTO, pString != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
231 ASN1_STRING_set(pString, pAttrVal->GetPointer(), pAttrVal->GetRemaining());
233 pAsn1Type = ASN1_TYPE_new();
234 SysTryCatch(NID_SEC_CRYPTO, pString != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
236 ASN1_TYPE_set(pAsn1Type, tagType, pString);
238 value = sk_ASN1_TYPE_push(pAttribute->value.set, pAsn1Type);
239 SysTryCatch(NID_SEC_CRYPTO, value > 0, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] The method cannot proceed due to a severe system error.");
242 count = X509_ATTRIBUTE_count(pAttribute);
244 value = i2d_X509_ATTRIBUTE(pAttribute, &pTemp);
245 SysTryCatch(NID_SEC_CRYPTO, value > 0, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] The method cannot proceed due to a severe system error.");
247 pAttributeBuffer = std::unique_ptr< ByteBuffer >(new (std::nothrow) ByteBuffer());
248 SysTryCatch(NID_SEC_CRYPTO, pAttributeBuffer, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
250 r = pAttributeBuffer->Construct(value);
251 SysTryCatch(NID_SEC_CRYPTO, !IsFailed(r), r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
253 r = pAttributeBuffer->SetArray(pTemp, 0, value);
254 SysTryCatch(NID_SEC_CRYPTO, !IsFailed(r), r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] The method cannot proceed due to a severe system error.");
256 pAttributeBuffer->Flip();
262 pAttributeBuffer.reset(null);
264 X509_ATTRIBUTE_free(pAttribute);
267 return pAttributeBuffer.release();
271 _Pkcs08AttributeImpl*
272 _Pkcs08AttributeImpl::GetInstance(Pkcs08Attribute& pkcs08Attribute)
274 return pkcs08Attribute.__pPkcs08AttributeImpl;
277 const _Pkcs08AttributeImpl*
278 _Pkcs08AttributeImpl::GetInstance(const Pkcs08Attribute& pkcs08Attribute)
280 return pkcs08Attribute.__pPkcs08AttributeImpl;