Как импортировать открытый ключ Elliptical p256 с помощью TSS.MSR (C ++) - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь импортировать открытый ключ из другой системы в мою систему, используя библиотеку Microsoft MSR.TSS (C ++), чтобы настроить обмен ключами Диффи-Хеллмана.

Однако я получаю следующую ошибку: «Ошибка TPM - TPM_RC :: SIZE: Предпринята попытка присоединиться или заменить диск, для которого каталог на диске является целью предыдущей замены.»

Вот мой пример кода:

            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

1 Ответ

0 голосов
/ 23 октября 2019

Я понял: метод «Create» создает ключ с нуля, мне нужен метод «LoadExternal» для загрузки части открытого ключа:

        //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));
...