1 /* 2 * Copyright 2014 The Android Open Source Project 3 * 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 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 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. 15 */ 16 17 #ifndef SYSTEM_KEYMASTER_OPENSSL_UTILS_H_ 18 #define SYSTEM_KEYMASTER_OPENSSL_UTILS_H_ 19 20 #include <openssl/evp.h> 21 #include <openssl/bn.h> 22 23 struct EVP_PKEY_Delete { 24 void operator()(EVP_PKEY* p) const { EVP_PKEY_free(p); } 25 }; 26 27 struct BIGNUM_Delete { 28 void operator()(BIGNUM* p) const { BN_free(p); } 29 }; 30 31 /** 32 * Many OpenSSL APIs take ownership of an argument on success but don't free the argument on 33 * failure. This means we need to tell our scoped pointers when we've transferred ownership, without 34 * triggering a warning by not using the result of release(). 35 */ 36 template <typename T, typename Delete_T> 37 inline void release_because_ownership_transferred(UniquePtr<T, Delete_T>& p) { 38 T* val __attribute__((unused)) = p.release(); 39 } 40 41 inline void convert_bn_to_blob(BIGNUM* bn, keymaster_blob_t* blob) { 42 blob->data_length = BN_num_bytes(bn); 43 blob->data = new uint8_t[blob->data_length]; 44 BN_bn2bin(bn, const_cast<uint8_t*>(blob->data)); 45 } 46 47 #endif // SYSTEM_KEYMASTER_OPENSSL_UTILS_H_ 48