首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用TSS.MSR (C++)导入椭圆p256公钥

如何使用TSS.MSR (C++)导入椭圆p256公钥
EN

Stack Overflow用户
提问于 2019-10-23 00:34:41
回答 1查看 111关注 0票数 0

我正在尝试使用微软的MSR.TSS库(C++)将另一个系统的公钥导入到我的系统中,以便建立Diffie-Hellman密钥交换。

然而,我得到了以下错误:"TPM Error - TPM_RC::SIZE:有人试图加入或替换一个驱动器,该驱动器上的某个目录是上一个替换驱动器的目标。“

下面是我的示例代码:

代码语言:javascript
复制
            storagePrimaryHandle = MakeStoragePrimary();


            TPMT_PUBLIC eccTemplate(TPM_ALG_ID::SHA256,
                TPMA_OBJECT::decrypt | 
                TPMA_OBJECT::fixedParent | 
                TPMA_OBJECT::fixedTPM |
                TPMA_OBJECT::sensitiveDataOrigin | 
                TPMA_OBJECT::userWithAuth,
                NullVec,
                TPMS_ECC_PARMS(
                    TPMT_SYM_DEF_OBJECT(TPM_ALG_ID::_NULL, 0, TPM_ALG_ID::_NULL), 
                    TPMS_KEY_SCHEME_ECDH(TPM_ALG_ID::SHA256), 
                    TPM_ECC_CURVE::NIST_P256, 
                    TPMS_NULL_KDF_SCHEME()),
                TPMS_ECC_POINT()
            );


            //Import the public key
            //Create a vector with the 64 byte public key
            vector<BYTE> pubVector(publicKey, publicKey + publicKeyLength);

            //Indicate this is an uncompressed key
            pubVector.insert(pubVector.begin(), 1, 0x04);

            inPublic = _tpm.Create(storagePrimaryHandle, TPMS_SENSITIVE_CREATE(), eccTemplate, pubVector, vector<TPMS_PCR_SELECTION>());

需要注意的几件事: 1)如果我传入一个空向量而不是"pubVector“,它仍然有效2)如果我去掉了0x04 (表示一个未压缩的公钥),它仍然失败

我的工作基于以下位置的代码:https://github.com/microsoft/TSS.MSR/tree/master/TSS.CPP/Samples

EN

回答 1

Stack Overflow用户

发布于 2019-10-23 23:51:50

我弄明白了:"Create“方法从头开始创建一个密钥,我需要"LoadExternal”方法来加载公钥部分:

代码语言:javascript
复制
        //publicKey is a BYTE array of the p256 public key 64 bytes long (without the leading 04 = uncompressed)
        vector<BYTE> pubKeyX(publicKey, publicKey + 32);
        vector<BYTE> pubKeyY(publicKey+32, publicKey + 64);

        TPMT_PUBLIC eccTemplate(TPM_ALG_ID::SHA1,
            TPMA_OBJECT::decrypt | 
            TPMA_OBJECT::fixedParent | 
            TPMA_OBJECT::fixedTPM |
            TPMA_OBJECT::sensitiveDataOrigin | 
            TPMA_OBJECT::userWithAuth,
            NullVec,
            TPMS_ECC_PARMS(
                TPMT_SYM_DEF_OBJECT(TPM_ALG_ID::_NULL, 0, TPM_ALG_ID::_NULL), 
                TPMS_KEY_SCHEME_ECDH(TPM_ALG_ID::SHA256), 
                TPM_ECC_CURVE::NIST_P256, 
                TPMS_NULL_KDF_SCHEME()),
            TPMS_ECC_POINT(pubKeyX, pubKeyY)
        );

        pubHandle = _tpm.LoadExternal(TPMT_SENSITIVE::NullObject(), eccTemplate, TPM_HANDLE::FromReservedHandle(TPM_RH::_NULL));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58508732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档