Пакет SDK Python для Azure keyvault и метод sign () дают недопустимую длину значения: 44 байта. ES256 требует 32 байта, закодированных с помощью base64url

За исключением данных, которые я передаю sign () , 32 байта закодированы в urlsafe-base64. Понятия не имею, откуда у них 44.

#!/usr/bin/env python3

from azure.keyvault import KeyVaultClient
from msrestazure.azure_active_directory import MSIAuthentication
from base64 import urlsafe_b64encode
from hashlib import blake2b
from binascii import unhexlify

kvclient = KeyVaultClient(MSIAuthentication(resource='https://vault.azure.net'));
op = urlsafe_b64encode(blake2b(unhexlify('00112233'), digest_size=32).digest())
print(op)
sig = kvclient.sign('https://REDACTED1.vault.azure.net', 'REDACTED2', 'REDACTED3', 'ES256', op)

$ ./aclient.py
b'QO46UZnfhhh93VCTkagtPzWj1Z-4PvmzmKdsmA4fepY='
Traceback (most recent call last):
  File "./aclient.py", line 12, in <module>
    sig = kvclient.sign('https://REDACTED1.vault.azure.net', 'REDACTED2', 'REDACTED3', 'ES256', op)
  File "/home/dev/hsm/lib/python3.6/site-packages/azure/keyvault/v7_0/key_vault_client.py", line 1022, in sign
    raise models.KeyVaultErrorException(self._deserialize, response)
azure.keyvault.v7_0.models.keyvault.v7_0.models.key_vault_error_py3.KeyVaultErrorException: (BadParameter) Invalid length of 'value': 44 bytes. ES256 requires 32 bytes, encoded with base64url.

Аутентификация / токен там обрабатывается через назначенный системой управляемый идентификатор - ES256 предназначен для подписи ключа ECC P256. R1 - это имя моего домена keyvault, R2 - имя ключа, r3 - версия ключа. Я использую документы из Пакет SDK Azure для Python - Keyvault. Также я попробовал стандартную функцию кодирования base64 python вместо «urlsafe», я получил то же самое.


person Optical Carrier    schedule 18.02.2019    source источник


Ответы (1)


На самом деле, я считаю, что понял это, и, по-видимому, сообщение об ошибке ES256 requires 32 bytes, encoded with base64url - это просто отвлекающий маневр, очевидно, просто не применимый к SDK, и я думаю, что это сообщение существует только для поддержки REST API для знака:

Если вы посмотрите на SDK пример для функции sign (), посмотрите на строку 344. Она использует переменную с именем 'digest' в качестве байтов, передаваемых в качестве значения функции sign (). в строке 337 создается этот дайджест, и все мы знаем, что эти дайджесты имеют 32-байтовый двоичный тип.

Поэтому, несмотря на эту ошибку, эта функция sign () не должна сначала кодировать данные base64. Я почти на 100% уверен, что ошибка связана с поддержкой REST API, который действительно использует строки в кодировке base64 для представления 32-байтовых данных, которые должны быть подписаны, где длина строки base64url в конечном итоге составляет 44 символа.

`DOH

person Optical Carrier    schedule 21.02.2019
comment
Привет, у меня такая же проблема. когда я передаю необработанный tx, например eb8085037e11d60082520894654b464b06c40c3eb6f2f8e3cf5d7ee4e0aa34bf87038d7ea4c68000801c8080, он выдает ошибку. - person Sunny; 11.06.2019