/* * Copyright (c) 2021, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "credstore" #include #include #include #include #include #include "Session.h" #include "Util.h" namespace android { namespace security { namespace identity { using std::optional; using ::android::hardware::identity::IPresentationSession; using ::android::hardware::identity::IWritableIdentityCredential; using ::android::hardware::identity::support::ecKeyPairGetPkcs12; using ::android::hardware::identity::support::ecKeyPairGetPrivateKey; using ::android::hardware::identity::support::ecKeyPairGetPublicKey; using ::android::hardware::identity::support::hexdump; using ::android::hardware::identity::support::sha256; Status Session::getEphemeralKeyPair(vector* _aidl_return) { vector keyPair; Status status = halBinder_->getEphemeralKeyPair(&keyPair); if (!status.isOk()) { return halStatusToGenericError(status); } time_t nowSeconds = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); time_t validityNotBefore = nowSeconds; time_t validityNotAfter = nowSeconds + 24 * 60 * 60; optional> pkcs12Bytes = ecKeyPairGetPkcs12(keyPair, "ephemeralKey", // Alias for key "0", // Serial, as a decimal number "Credstore", // Issuer "Ephemeral Key", // Subject validityNotBefore, validityNotAfter); if (!pkcs12Bytes) { return Status::fromServiceSpecificError(ICredentialStore::ERROR_GENERIC, "Error creating PKCS#12 structure for key pair"); } *_aidl_return = pkcs12Bytes.value(); return Status::ok(); } Status Session::setReaderEphemeralPublicKey(const vector& publicKey) { Status status = halBinder_->setReaderEphemeralPublicKey(publicKey); if (!status.isOk()) { return halStatusToGenericError(status); } return Status::ok(); } Status Session::setSessionTranscript(const vector& sessionTranscript) { Status status = halBinder_->setSessionTranscript(sessionTranscript); if (!status.isOk()) { return halStatusToGenericError(status); } return Status::ok(); } Status Session::getCredentialForPresentation(const string& credentialName, sp* _aidl_return) { return store_->getCredentialCommon(credentialName, cipherSuite_, halBinder_, _aidl_return); } Status Session::getAuthChallenge(int64_t* _aidl_return) { *_aidl_return = 0; int64_t authChallenge; Status status = halBinder_->getAuthChallenge(&authChallenge); if (!status.isOk()) { return halStatusToGenericError(status); } *_aidl_return = authChallenge; return Status::ok(); } } // namespace identity } // namespace security } // namespace android