Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions sdk/keyvault/azure-keyvault-keys/HISTORY.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
# Release History

## 4.0.0b4
### Breaking changes:
- Enums 'JsonWebKeyCurveName', 'JsonWebKeyOperation', and 'JsonWebKeyType' have
been renamed to 'KeyCurveName', 'KeyOperation', and 'KeyType', respectively.

### Fixes and improvements:
- The `key` argument to `import_key` should be an instance of `azure.keyvault.keys.JsonWebKey`
([#7590](https://github.com/Azure/azure-sdk-for-python/pull/7590))


## 4.0.0b3 (2019-09-11)
### Breaking changes:
- `CryptographyClient` methods `wrap` and `unwrap` are renamed `wrap_key` and
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@
# -------------------------------------
from .client import KeyClient
from .enums import KeyCurveName, KeyOperation, KeyType
from .models import JsonWebKey

__all__ = ["KeyCurveName", "KeyOperation", "KeyType", "KeyClient"]
__all__ = ["JsonWebKey", "KeyCurveName", "KeyOperation", "KeyType", "KeyClient"]
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,6 @@ async def import_key(
else:
attributes = None
bundle = await self._client.import_key(
self.vault_url, name, key=key, hsm=hsm, key_attributes=attributes, tags=tags, **kwargs
self.vault_url, name, key=key._to_generated_model(), hsm=hsm, key_attributes=attributes, tags=tags, **kwargs
)
return Key._from_key_bundle(bundle)
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from typing import Any, Dict, List, Optional, Union
from datetime import datetime
from azure.core.paging import ItemPaged
from .models import JsonWebKey


class KeyClient(KeyVaultClientBase):
Expand Down Expand Up @@ -530,7 +531,7 @@ def restore_key(self, backup, **kwargs):
def import_key(
self,
name, # type: str
key, # type: List[str]
key, # type: JsonWebKey
hsm=None, # type: Optional[bool]
enabled=None, # type: Optional[bool]
not_before=None, # type: Optional[datetime]
Expand Down Expand Up @@ -560,6 +561,6 @@ def import_key(
else:
attributes = None
bundle = self._client.import_key(
self.vault_url, name, key=key, hsm=hsm, key_attributes=attributes, tags=tags, **kwargs
self.vault_url, name, key=key._to_generated_model(), hsm=hsm, key_attributes=attributes, tags=tags, **kwargs
)
return Key._from_key_bundle(bundle)
44 changes: 20 additions & 24 deletions sdk/keyvault/azure-keyvault-keys/azure/keyvault/keys/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
# -------------------------------------
from collections import namedtuple
from ._shared import parse_vault_id
from ._shared._generated.v7_0.models import JsonWebKey as _JsonWebKey

try:
from typing import TYPE_CHECKING
Expand All @@ -18,6 +19,7 @@

KeyOperationResult = namedtuple("KeyOperationResult", ["id", "value"])


class JsonWebKey(object):
# pylint:disable=too-many-instance-attributes
"""As of http://tools.ietf.org/html/draft-ietf-jose-json-web-key-18. All parameters are optional.
Expand All @@ -43,25 +45,19 @@ class JsonWebKey(object):
:param bytes y: Y component of an EC public key.
"""

FIELDS = ("kid", "kty", "key_ops", "n", "e", "d", "dp", "dq", "qi", "p", "q", "k", "t", "crv", "x", "y")

def __init__(self, **kwargs):
# type: (**Any) -> None
super(JsonWebKey, self).__init__(**kwargs)
self.kid = kwargs.get("kid", None)
self.kty = kwargs.get("kty", None)
self.key_ops = kwargs.get("key_ops", None)
self.n = kwargs.get("n", None)
self.e = kwargs.get("e", None)
self.d = kwargs.get("d", None)
self.dp = kwargs.get("dp", None)
self.dq = kwargs.get("dq", None)
self.qi = kwargs.get("qi", None)
self.p = kwargs.get("p", None)
self.q = kwargs.get("q", None)
self.k = kwargs.get("k", None)
self.t = kwargs.get("t", None)
self.crv = kwargs.get("crv", None)
self.x = kwargs.get("x", None)
self.y = kwargs.get("y", None)
for field in self.FIELDS:
setattr(self, field, kwargs.get(field))

def _to_generated_model(self):
# type: () -> _JsonWebKey
jwk = _JsonWebKey()
for field in self.FIELDS:
setattr(jwk, field, getattr(self, field))
return jwk


class KeyProperties(object):
Expand Down Expand Up @@ -205,8 +201,8 @@ def _from_key_bundle(cls, key_bundle):
# type: (_models.KeyBundle) -> Key
"""Construct a Key from an autorest-generated KeyBundle"""
return cls(
properties=KeyProperties._from_key_bundle(key_bundle), #pylint: disable=protected-access
key_material=key_bundle.key
properties=KeyProperties._from_key_bundle(key_bundle), # pylint: disable=protected-access
key_material=key_bundle.key,
)

@property
Expand Down Expand Up @@ -243,7 +239,7 @@ def __init__(
key_material=None, # type: _models.JsonWebKey
deleted_date=None, # type: Optional[datetime]
recovery_id=None, # type: Optional[str]
scheduled_purge_date=None # type: Optional[datetime]
scheduled_purge_date=None, # type: Optional[datetime]
):
# type: (...) -> None
super(DeletedKey, self).__init__(properties, key_material)
Expand All @@ -256,22 +252,22 @@ def _from_deleted_key_bundle(cls, deleted_key_bundle):
# type: (_models.DeletedKeyBundle) -> DeletedKey
"""Construct a DeletedKey from an autorest-generated DeletedKeyBundle"""
return cls(
properties=KeyProperties._from_key_bundle(deleted_key_bundle), #pylint: disable=protected-access
properties=KeyProperties._from_key_bundle(deleted_key_bundle), # pylint: disable=protected-access
key_material=deleted_key_bundle.key,
deleted_date=deleted_key_bundle.deleted_date,
recovery_id=deleted_key_bundle.recovery_id,
scheduled_purge_date=deleted_key_bundle.scheduled_purge_date
scheduled_purge_date=deleted_key_bundle.scheduled_purge_date,
)

@classmethod
def _from_deleted_key_item(cls, deleted_key_item):
# type: (_models.DeletedKeyItem) -> DeletedKey
"""Construct a DeletedKey from an autorest-generated DeletedKeyItem"""
return cls(
properties=KeyProperties._from_key_item(deleted_key_item), #pylint: disable=protected-access
properties=KeyProperties._from_key_item(deleted_key_item), # pylint: disable=protected-access
deleted_date=deleted_key_item.deleted_date,
recovery_id=deleted_key_item.recovery_id,
scheduled_purge_date=deleted_key_item.scheduled_purge_date
scheduled_purge_date=deleted_key_item.scheduled_purge_date,
)

@property
Expand Down
3 changes: 1 addition & 2 deletions sdk/keyvault/azure-keyvault-keys/tests/test_crypto_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@
import codecs
import hashlib

from azure.keyvault.keys import KeyCurveName
from azure.keyvault.keys import JsonWebKey, KeyCurveName
from azure.keyvault.keys.crypto import EncryptionAlgorithm, KeyWrapAlgorithm, SignatureAlgorithm
from azure.keyvault.keys._shared._generated.v7_0.models import JsonWebKey
from azure.mgmt.keyvault.models import KeyPermissions, Permissions
from devtools_testutils import ResourceGroupPreparer
from keys_preparer import VaultClientPreparer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@
import codecs
import hashlib

from azure.keyvault.keys import KeyCurveName
from azure.keyvault.keys import JsonWebKey, KeyCurveName
from azure.keyvault.keys.crypto import CryptographyClient, EncryptionAlgorithm, KeyWrapAlgorithm, SignatureAlgorithm
from azure.keyvault.keys._shared._generated.v7_0.models import JsonWebKey
from azure.mgmt.keyvault.models import KeyPermissions, Permissions
from devtools_testutils import ResourceGroupPreparer
from keys_async_preparer import AsyncVaultClientPreparer
Expand All @@ -28,7 +27,9 @@ def _validate_rsa_key_bundle(self, key_attributes, vault, key_name, kty, key_ops
self.assertEqual(key.kty, kty, "kty should by '{}', but is '{}'".format(key, key.kty))
self.assertTrue(key.n and key.e, "Bad RSA public material.")
self.assertEqual(key_ops, key.key_ops, "keyOps should be '{}', but is '{}'".format(key_ops, key.key_ops))
self.assertTrue(key_attributes.properties.created and key_attributes.properties.updated, "Missing required date attributes.")
self.assertTrue(
key_attributes.properties.created and key_attributes.properties.updated, "Missing required date attributes."
)

async def _import_test_key(self, client, name):
def _to_bytes(hex):
Expand Down
2 changes: 1 addition & 1 deletion sdk/keyvault/azure-keyvault-keys/tests/test_key_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import time

from azure.core.exceptions import ResourceNotFoundError
from azure.keyvault.keys._shared._generated.v7_0.models import JsonWebKey
from azure.keyvault.keys.models import JsonWebKey
from keys_preparer import VaultClientPreparer
from keys_test_case import KeyVaultTestCase
from devtools_testutils import ResourceGroupPreparer
Expand Down
2 changes: 1 addition & 1 deletion sdk/keyvault/azure-keyvault-keys/tests/test_keys_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from keys_async_preparer import AsyncVaultClientPreparer
from keys_async_test_case import AsyncKeyVaultTestCase

from azure.keyvault.keys._shared._generated.v7_0.models import JsonWebKey
from azure.keyvault.keys.models import JsonWebKey

from dateutil import parser as date_parse

Expand Down