blob: eef918a5a796b134a52fd876a178d02a8444482f [file] [log] [blame]
/*
*
* Copyright (c) 2022 Project CHIP Authors
* All rights reserved.
*
* 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.
*/
#include <controller/python/chip/crypto/p256keypair.h>
#include <cassert>
#include <lib/support/Span.h>
#include <lib/support/logging/CHIPLogging.h>
using namespace chip;
using namespace chip::python;
using namespace chip::Crypto;
pychip_P256Keypair::pychip_P256Keypair(void * aPyContext, pychip_P256Keypair_ECDSA_sign_msg aSignMsgFunct,
pychip_P256Keypair_ECDH_derive_secret aDeriveSecretFunct) :
mPyContext(aPyContext),
mSignMsgFunct(aSignMsgFunct), mDeriveSecretFunct(aDeriveSecretFunct)
{}
pychip_P256Keypair::~pychip_P256Keypair()
{
// Just override the initialize routing to avoid calling the Initialize from the platform's code.
}
CHIP_ERROR pychip_P256Keypair::Initialize(Crypto::ECPKeyTarget key_target)
{
// Just override the initialize routing to avoid calling the Initialize from the platform's code.
return CHIP_NO_ERROR;
}
CHIP_ERROR pychip_P256Keypair::Serialize(Crypto::P256SerializedKeypair & output) const
{
return CHIP_ERROR_NOT_IMPLEMENTED;
}
CHIP_ERROR pychip_P256Keypair::Deserialize(Crypto::P256SerializedKeypair & input)
{
return CHIP_ERROR_NOT_IMPLEMENTED;
}
CHIP_ERROR pychip_P256Keypair::NewCertificateSigningRequest(uint8_t * csr, size_t & csr_length) const
{
return CHIP_ERROR_NOT_IMPLEMENTED;
}
CHIP_ERROR pychip_P256Keypair::ECDSA_sign_msg(const uint8_t * msg, size_t msg_length,
Crypto::P256ECDSASignature & out_signature) const
{
VerifyOrReturnError(mSignMsgFunct != nullptr, CHIP_ERROR_NOT_IMPLEMENTED);
size_t signatureLength = out_signature.Capacity();
VerifyOrReturnError(mSignMsgFunct(mPyContext, msg, msg_length, out_signature.Bytes(), &signatureLength), CHIP_ERROR_INTERNAL);
out_signature.SetLength(signatureLength);
return CHIP_NO_ERROR;
}
CHIP_ERROR pychip_P256Keypair::ECDH_derive_secret(const Crypto::P256PublicKey & remote_public_key,
Crypto::P256ECDHDerivedSecret & out_secret) const
{
VerifyOrReturnError(mDeriveSecretFunct != nullptr, CHIP_ERROR_NOT_IMPLEMENTED);
size_t secretLength = out_secret.Capacity();
VerifyOrReturnError(mDeriveSecretFunct(mPyContext, remote_public_key.ConstBytes(), out_secret.Bytes(), &secretLength),
CHIP_ERROR_INTERNAL);
out_secret.SetLength(secretLength);
return CHIP_NO_ERROR;
}
void pychip_P256Keypair::UpdatePubkey(const FixedByteSpan<kP256_PublicKey_Length> & aPublicKey)
{
mPublicKey = aPublicKey;
mInitialized = true;
}
chip::python::pychip_P256Keypair * pychip_NewP256Keypair(void * pyObject, pychip_P256Keypair_ECDSA_sign_msg aSignMsgFunct,
pychip_P256Keypair_ECDH_derive_secret aDeriveSecretFunct)
{
auto res = new pychip_P256Keypair(pyObject, aSignMsgFunct, aDeriveSecretFunct);
return res;
}
PyChipError pychip_P256Keypair_UpdatePubkey(chip::python::pychip_P256Keypair * this_, uint8_t * aPubKey, size_t aPubKeyLen)
{
VerifyOrReturnError(aPubKeyLen == kP256_PublicKey_Length, ToPyChipError(CHIP_ERROR_INVALID_ARGUMENT));
this_->UpdatePubkey(FixedByteSpan<Crypto::kP256_PublicKey_Length>(aPubKey));
return ToPyChipError(CHIP_NO_ERROR);
}
void pychip_DeleteP256Keypair(chip::python::pychip_P256Keypair * this_)
{
delete this_;
}