Отсутствует bcrypt.dll при использовании azure-iot-sdk-csharp - ›SecurityProviderTpmHsm на linux-arm

Я хочу использовать azure-iot-sdk-csharp для подготовки устройства на базе Linux на Azure iot dps с использованием TPM в качестве механизма аутентификации.

Я добавил модуль TPM к плате raspberry и настроил ядро ​​/ deviceTree. Чип TPM обнаружен, и устройство / dev / tpm0 отображается в Linux. Дополнительно я включил в образ linux все необходимые условия для запуска автономного приложения .net-core на Linux (https://github.com/dotnet/core/blob/master/samples/YoctoInstructions.md). Можно запускать приложения .net-core ... Я протестировал простое соединение с Iot-Hub с помощью c # device-sdk.

Затем я попытался получить доступ к модулю TPM из ядра .NET. Поэтому я написал эту программу, используя SecurityProviderTpmHsm из Microsoft.Azure.Devices.Provisioning.Security для чтения ключа подтверждения TPM.

using System;
using System.Text;
using Microsoft.Azure.Devices.Provisioning.Security;
using Microsoft.Azure.Devices.Shared;

namespace TPMTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var tpmProvider = new SecurityProviderTpmHsm("test");

            var test = tpmProvider.GetEndorsementKey();
            Console.WriteLine(BitConverter.ToString(test));
        }
    }
}

Это работает на машине Windows, но не работает на машине linux-arm с автономным пакетом (dotnet publish -r linux-arm).

Hello World!

Unhandled Exception: System.DllNotFoundException: Unable to load shared library 'bcrypt.dll' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libbcrypt.dll: cannot open shared object file: No such file or directory
   at Tpm2Lib.Native.BCryptOpenAlgorithmProvider(UIntPtr& AlgProvider, String AlgId, String Implementation, UInt32 Flags)
   at Tpm2Lib.BCryptAlgorithm.Open(String algName, UInt32 flags)
   at Tpm2Lib.BCryptAlgorithm..ctor(String algName, UInt32 flags)
   at Tpm2Lib.CryptoLib.Hmac(TpmAlgId hashAlgId, Byte[] key, Byte[] data)
   at Tpm2Lib.KDF.KDFa(TpmAlgId hmacHash, Byte[] hmacKey, String label, Byte[] contextU, Byte[] contextV, Int32 numBitsRequired)
   at Tpm2Lib.PRNG.FillRandBuf()
   at Tpm2Lib.PRNG.SetRngRandomSeed()
   at Tpm2Lib.PRNG.GetRandomBytes(Int32 numBytes)
   at Tpm2Lib.Globs.GetRandomBytes(Int32 numBytes)
   at Tpm2Lib.Tpm2.GetRandomBytes(Int32 numBytes)
   at Tpm2Lib.Tpm2.CancelSafeStartAuthSession(TpmSe sessionType, TpmAlgId authHash, Int32 nonceCallerSize)
   at Tpm2Lib.Tpm2.PrepareRequestSessions(CommandInfo commandInfo, TpmHandle[] inHandles)
   at Tpm2Lib.Tpm2.DispatchMethod(TpmCc ordinal, TpmStructureBase inParms, Type expectedResponseType, TpmStructureBase& outParms, Int32 numInHandlesNotUsed, Int32 numOutHandlesNotUsed)
   at Tpm2Lib.Tpm2.CreatePrimary(TpmHandle primaryHandle, SensitiveCreate inSensitive, TpmPublic inPublic, Byte[] outsideInfo, PcrSelection[] creationPCR, TpmPublic& outPublic, CreationData& creationData, Byte[]& creationHash, TkCreation& creationTicket)
   at Microsoft.Azure.Devices.Provisioning.Security.SecurityProviderTpmHsm.ReadOrCreatePersistedKey(TpmHandle persHandle, TpmHandle hierarchy, TpmPublic template)
   at Microsoft.Azure.Devices.Provisioning.Security.SecurityProviderTpmHsm.CacheEkAndSrk()
   at Microsoft.Azure.Devices.Provisioning.Security.SecurityProviderTpmHsm..ctor(String registrationId, Tpm2Device tpm)
   at Microsoft.Azure.Devices.Provisioning.Security.SecurityProviderTpmHsm..ctor(String registrationId)
   at TPMTest.Program.Main(String[] args) in C:\Users\admin\source\repos\TPMTest\TPMTest\Program.cs:line 12
Aborted

Я прочитал некоторые проблемы с отсутствующим bcrypted.dll на github. Насколько я понимаю, некоторые криптографические функции не портированы в .net core 2.x для linux. https://github.com/dotnet/corefx/issues/7023 Итак, я попробовал предварительный просмотр .net-core 3.x, который поддерживает AES-GCM и т. д. ... но я столкнулся с той же ошибкой.

Не уверен, связана ли эта проблема с моей проблемой.

Есть ли недостающая зависимость, которая мне нужна в моем образе Linux? Поддерживается ли вообще использование модуля TPM в .net-core на компьютере под управлением Linux?


person ToBu    schedule 28.01.2019    source источник
comment
Вы нашли для этого решение?   -  person Christoph Fink    schedule 04.08.2020


Ответы (1)


Microsoft.Azure.Devices.Provisioning.Security.Tpm полагается на пакет NuGet Microsoft.TSS 2.0.1, который содержит только двоичные файлы для linux-x64.

Чтобы заставить его работать:

  1. git clone TSS.MSR и azure-iot-sdk-csharp
  2. в /TSS.NET/TSS.Net/TSS.Net.csproj измените это:
<PropertyGroup Condition=" '$(RuntimeIdentifier)' == 'linux-x64' Or '$(OS)' == 'Unix'  Or '$(OS)' == 'Linux'">

к этому

<PropertyGroup Condition=" '$(RuntimeIdentifier)' == 'linux-x64' Or '$(RuntimeIdentifier)' == 'linux-arm' Or '$(OS)' == 'Unix'  Or '$(OS)' == 'Linux'">
  1. Ссылка на TSS.Net.csproj в Microsoft.Azure.Devices.Provisioning.Security.Tpm

  2. Ссылка на Microsoft.Azure.Devices.Provisioning.Security.Tpm.csproj в вашем проекте вместо пакета NuGet

  3. dotnet build --runtime linux-arm --configuration Release

person Daniele Maggio    schedule 07.02.2019
comment
спасибо за ваш ответ. Я попробовал, но, к сожалению, столкнулся с той же ошибкой. Трассировка немного более четкая (- ›BcryptInterface.cs)` `` `[DllImport (bcrypt.dll, CharSet = CharSet.Unicode)] internal static extern int BCryptOpenAlgorithmProvider (out UIntPtr AlgProvider, [Interop.MarshalAs (UnmanagedWStrpe), В] String AlgId, [Interop.MarshalAs (UnmanagedType.LPWStr), In] String Implementati «` `Но я не знаю, как получить там недостающую зависимость. - person ToBu; 11.02.2019