Если то, что вы подразумеваете под первым предложением, имеет аналогичную (хотя бы частично) службу Key Vault с Google Cloud Platform (это Cloud Key Management Service он же KMS) тогда ответ - нет.
В то время как для хранилища ключей Azure доступна эллиптическая кривая SECP256K1
, на данный момент для Cloud KMS единственные доступные эллиптические кривые P-256 и P-384.
Кривые P-256
и SECP256K1
не совпадают, и на данный момент P-256
определено в FIPS-186-4 и SECP256K1
в Стандарты для эффективной криптографии Версия 2 .
В любом случае, чтобы поддержать все это, вы можете запустить следующий эксперимент.
Создать ASYMMETRIC_SIGN
целевой ключ с Cloud SDK ( см. инструкции ):
keyring=keyring0
key=key0
location=US
gcloud kms keyrings create $keyring --location=$location
gcloud kms keys create $key --location $location --keyring $keyring --purpose asymmetric-signing --default-algorithm ec-sign-p256-sha256 --protection-level software
Подпишите сообщение и импортируйте открытый ключ ранее сгенерированной (сгенерированной KMS) пары ключей.
message=message
signature=message.sig
echo $(date):$(uname -a) > $message
gcloud kms asymmetric-sign --keyring=$keyring --key=$key --location=$location --input-file=$message --signature-file=$signature --digest-algorithm=sha256 --version=1
gcloud kms keys versions get-public-key 1 --location=$location --keyring=$keyring --key=$key --output-file=./$keyring-$key.pub
Теперь вы можете проверить подпись с помощью openssl dgst -verify $keyring-$key.pub -signature $signature $message
, но вы не получите информациюоб эллиптической кривой, используемой для генерации пары ключей, секретный ключ которой использовался для подписи.
Чтобы получить эту информацию, мы могли бы установить стороннюю библиотеку Python:
virtualenv --python=/usr/bin/python3 ecdsa
cd ecdsa
source bin/activate
pip install ecdsa
И выполните следующую команду, чтобы проверить подпись и увидеть кривую, используемую KMS при выборе алгоритма подписи ec-sign-p256-sha256
:
python3 -c """
from pathlib import Path
import hashlib
from ecdsa import VerifyingKey, BadSignatureError
publickey = Path('$keyring-$key.pub')
signature = Path('$signature')
message = Path('$message')
def read_signature(signature):
'''
workaround for https://github.com/warner/python-ecdsa/issues/67
more background on why's that in https://tools.ietf.org/html/rfc5652
'''
LEN = 64
LENHALF = LEN//2
with signature.open('rb') as fp:
sig = fp.read()
offset = 4 if sig[4] else 5
slice_s, slice_r = slice(offset, offset + LENHALF), slice(-LENHALF, len(sig))
s,r = sig[slice_s], sig[slice_r]
return s + r
def verify(publickey, signature, message):
with publickey.open() as pkfp, message.open('br') as messagefp:
vk = VerifyingKey.from_pem(pkfp.read())
try:
print('Verifying with public key associated with curve', repr(vk.curve.name))
vk.verify(read_signature(signature), messagefp.read(), hashfunc=hashlib.sha256)
print('Verify Success')
except BadSignatureError:
print('Verify Failure')
verify(publickey, signature, message)
"""
Чтобы получить точечную точку эллиптической кривой, используемой в KMSв этом примере, равном NIST P-256
и разностям его параметров с SECP256K1
, посмотрите следующий фрагмент:
python3 -c """
from collections import namedtuple
from operator import attrgetter
from ecdsa import NIST256p, SECP256k1
sextuple = namedtuple('T', 'p, a, b, G, n, h')
ag_curve = attrgetter(*('curve._CurveFp__'+c for c in 'abp'))
ag_generator = attrgetter(*('generator._Point__'+c for c in 'x y order'.split()))
def make_sextuple(curve, h=1):
n, G_x, G_y = ag_generator(curve)
return sextuple(*ag_curve(curve), n=n, G=(G_x, G_y), h=h)
T_NIST256p = make_sextuple(NIST256p)
T_SECP256k1 = make_sextuple(SECP256k1)
if T_NIST256p != T_SECP256k1:
for k in sextuple._fields:
ag_k = attrgetter(k)
v0, v1 = ag_k(T_NIST256p), ag_k(T_SECP256k1)
if v0 != v1:
print('Different values for parameter ', k,)
print(v0)
print(v1)
"""