You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
319 lines
9.2 KiB
Python
319 lines
9.2 KiB
Python
# DO NOT EDIT THIS FILE!
|
|
#
|
|
# This file is generated from the CDP specification. If you need to make
|
|
# changes, edit the generator and regenerate all of the modules.
|
|
#
|
|
# CDP domain: WebAuthn (experimental)
|
|
from __future__ import annotations
|
|
from .util import event_class, T_JSON_DICT
|
|
from dataclasses import dataclass
|
|
import enum
|
|
import typing
|
|
|
|
class AuthenticatorId(str):
|
|
def to_json(self) -> str:
|
|
return self
|
|
|
|
@classmethod
|
|
def from_json(cls, json: str) -> AuthenticatorId:
|
|
return cls(json)
|
|
|
|
def __repr__(self):
|
|
return 'AuthenticatorId({})'.format(super().__repr__())
|
|
|
|
|
|
class AuthenticatorProtocol(enum.Enum):
|
|
U2F = "u2f"
|
|
CTAP2 = "ctap2"
|
|
|
|
def to_json(self):
|
|
return self.value
|
|
|
|
@classmethod
|
|
def from_json(cls, json):
|
|
return cls(json)
|
|
|
|
|
|
class AuthenticatorTransport(enum.Enum):
|
|
USB = "usb"
|
|
NFC = "nfc"
|
|
BLE = "ble"
|
|
CABLE = "cable"
|
|
INTERNAL = "internal"
|
|
|
|
def to_json(self):
|
|
return self.value
|
|
|
|
@classmethod
|
|
def from_json(cls, json):
|
|
return cls(json)
|
|
|
|
|
|
@dataclass
|
|
class VirtualAuthenticatorOptions:
|
|
protocol: AuthenticatorProtocol
|
|
|
|
transport: AuthenticatorTransport
|
|
|
|
#: Defaults to false.
|
|
has_resident_key: typing.Optional[bool] = None
|
|
|
|
#: Defaults to false.
|
|
has_user_verification: typing.Optional[bool] = None
|
|
|
|
#: If set to true, tests of user presence will succeed immediately.
|
|
#: Otherwise, they will not be resolved. Defaults to true.
|
|
automatic_presence_simulation: typing.Optional[bool] = None
|
|
|
|
#: Sets whether User Verification succeeds or fails for an authenticator.
|
|
#: Defaults to false.
|
|
is_user_verified: typing.Optional[bool] = None
|
|
|
|
def to_json(self):
|
|
json = dict()
|
|
json['protocol'] = self.protocol.to_json()
|
|
json['transport'] = self.transport.to_json()
|
|
if self.has_resident_key is not None:
|
|
json['hasResidentKey'] = self.has_resident_key
|
|
if self.has_user_verification is not None:
|
|
json['hasUserVerification'] = self.has_user_verification
|
|
if self.automatic_presence_simulation is not None:
|
|
json['automaticPresenceSimulation'] = self.automatic_presence_simulation
|
|
if self.is_user_verified is not None:
|
|
json['isUserVerified'] = self.is_user_verified
|
|
return json
|
|
|
|
@classmethod
|
|
def from_json(cls, json):
|
|
return cls(
|
|
protocol=AuthenticatorProtocol.from_json(json['protocol']),
|
|
transport=AuthenticatorTransport.from_json(json['transport']),
|
|
has_resident_key=bool(json['hasResidentKey']) if 'hasResidentKey' in json else None,
|
|
has_user_verification=bool(json['hasUserVerification']) if 'hasUserVerification' in json else None,
|
|
automatic_presence_simulation=bool(json['automaticPresenceSimulation']) if 'automaticPresenceSimulation' in json else None,
|
|
is_user_verified=bool(json['isUserVerified']) if 'isUserVerified' in json else None,
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class Credential:
|
|
credential_id: str
|
|
|
|
is_resident_credential: bool
|
|
|
|
#: The ECDSA P-256 private key in PKCS#8 format.
|
|
private_key: str
|
|
|
|
#: Signature counter. This is incremented by one for each successful
|
|
#: assertion.
|
|
#: See https://w3c.github.io/webauthn/#signature-counter
|
|
sign_count: int
|
|
|
|
#: Relying Party ID the credential is scoped to. Must be set when adding a
|
|
#: credential.
|
|
rp_id: typing.Optional[str] = None
|
|
|
|
#: An opaque byte sequence with a maximum size of 64 bytes mapping the
|
|
#: credential to a specific user.
|
|
user_handle: typing.Optional[str] = None
|
|
|
|
def to_json(self):
|
|
json = dict()
|
|
json['credentialId'] = self.credential_id
|
|
json['isResidentCredential'] = self.is_resident_credential
|
|
json['privateKey'] = self.private_key
|
|
json['signCount'] = self.sign_count
|
|
if self.rp_id is not None:
|
|
json['rpId'] = self.rp_id
|
|
if self.user_handle is not None:
|
|
json['userHandle'] = self.user_handle
|
|
return json
|
|
|
|
@classmethod
|
|
def from_json(cls, json):
|
|
return cls(
|
|
credential_id=str(json['credentialId']),
|
|
is_resident_credential=bool(json['isResidentCredential']),
|
|
private_key=str(json['privateKey']),
|
|
sign_count=int(json['signCount']),
|
|
rp_id=str(json['rpId']) if 'rpId' in json else None,
|
|
user_handle=str(json['userHandle']) if 'userHandle' in json else None,
|
|
)
|
|
|
|
|
|
def enable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]:
|
|
'''
|
|
Enable the WebAuthn domain and start intercepting credential storage and
|
|
retrieval with a virtual authenticator.
|
|
'''
|
|
cmd_dict: T_JSON_DICT = {
|
|
'method': 'WebAuthn.enable',
|
|
}
|
|
json = yield cmd_dict
|
|
|
|
|
|
def disable() -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]:
|
|
'''
|
|
Disable the WebAuthn domain.
|
|
'''
|
|
cmd_dict: T_JSON_DICT = {
|
|
'method': 'WebAuthn.disable',
|
|
}
|
|
json = yield cmd_dict
|
|
|
|
|
|
def add_virtual_authenticator(
|
|
options: VirtualAuthenticatorOptions
|
|
) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,AuthenticatorId]:
|
|
'''
|
|
Creates and adds a virtual authenticator.
|
|
|
|
:param options:
|
|
:returns:
|
|
'''
|
|
params: T_JSON_DICT = dict()
|
|
params['options'] = options.to_json()
|
|
cmd_dict: T_JSON_DICT = {
|
|
'method': 'WebAuthn.addVirtualAuthenticator',
|
|
'params': params,
|
|
}
|
|
json = yield cmd_dict
|
|
return AuthenticatorId.from_json(json['authenticatorId'])
|
|
|
|
|
|
def remove_virtual_authenticator(
|
|
authenticator_id: AuthenticatorId
|
|
) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]:
|
|
'''
|
|
Removes the given authenticator.
|
|
|
|
:param authenticator_id:
|
|
'''
|
|
params: T_JSON_DICT = dict()
|
|
params['authenticatorId'] = authenticator_id.to_json()
|
|
cmd_dict: T_JSON_DICT = {
|
|
'method': 'WebAuthn.removeVirtualAuthenticator',
|
|
'params': params,
|
|
}
|
|
json = yield cmd_dict
|
|
|
|
|
|
def add_credential(
|
|
authenticator_id: AuthenticatorId,
|
|
credential: Credential
|
|
) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]:
|
|
'''
|
|
Adds the credential to the specified authenticator.
|
|
|
|
:param authenticator_id:
|
|
:param credential:
|
|
'''
|
|
params: T_JSON_DICT = dict()
|
|
params['authenticatorId'] = authenticator_id.to_json()
|
|
params['credential'] = credential.to_json()
|
|
cmd_dict: T_JSON_DICT = {
|
|
'method': 'WebAuthn.addCredential',
|
|
'params': params,
|
|
}
|
|
json = yield cmd_dict
|
|
|
|
|
|
def get_credential(
|
|
authenticator_id: AuthenticatorId,
|
|
credential_id: str
|
|
) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,Credential]:
|
|
'''
|
|
Returns a single credential stored in the given virtual authenticator that
|
|
matches the credential ID.
|
|
|
|
:param authenticator_id:
|
|
:param credential_id:
|
|
:returns:
|
|
'''
|
|
params: T_JSON_DICT = dict()
|
|
params['authenticatorId'] = authenticator_id.to_json()
|
|
params['credentialId'] = credential_id
|
|
cmd_dict: T_JSON_DICT = {
|
|
'method': 'WebAuthn.getCredential',
|
|
'params': params,
|
|
}
|
|
json = yield cmd_dict
|
|
return Credential.from_json(json['credential'])
|
|
|
|
|
|
def get_credentials(
|
|
authenticator_id: AuthenticatorId
|
|
) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,typing.List[Credential]]:
|
|
'''
|
|
Returns all the credentials stored in the given virtual authenticator.
|
|
|
|
:param authenticator_id:
|
|
:returns:
|
|
'''
|
|
params: T_JSON_DICT = dict()
|
|
params['authenticatorId'] = authenticator_id.to_json()
|
|
cmd_dict: T_JSON_DICT = {
|
|
'method': 'WebAuthn.getCredentials',
|
|
'params': params,
|
|
}
|
|
json = yield cmd_dict
|
|
return [Credential.from_json(i) for i in json['credentials']]
|
|
|
|
|
|
def remove_credential(
|
|
authenticator_id: AuthenticatorId,
|
|
credential_id: str
|
|
) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]:
|
|
'''
|
|
Removes a credential from the authenticator.
|
|
|
|
:param authenticator_id:
|
|
:param credential_id:
|
|
'''
|
|
params: T_JSON_DICT = dict()
|
|
params['authenticatorId'] = authenticator_id.to_json()
|
|
params['credentialId'] = credential_id
|
|
cmd_dict: T_JSON_DICT = {
|
|
'method': 'WebAuthn.removeCredential',
|
|
'params': params,
|
|
}
|
|
json = yield cmd_dict
|
|
|
|
|
|
def clear_credentials(
|
|
authenticator_id: AuthenticatorId
|
|
) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]:
|
|
'''
|
|
Clears all the credentials from the specified device.
|
|
|
|
:param authenticator_id:
|
|
'''
|
|
params: T_JSON_DICT = dict()
|
|
params['authenticatorId'] = authenticator_id.to_json()
|
|
cmd_dict: T_JSON_DICT = {
|
|
'method': 'WebAuthn.clearCredentials',
|
|
'params': params,
|
|
}
|
|
json = yield cmd_dict
|
|
|
|
|
|
def set_user_verified(
|
|
authenticator_id: AuthenticatorId,
|
|
is_user_verified: bool
|
|
) -> typing.Generator[T_JSON_DICT,T_JSON_DICT,None]:
|
|
'''
|
|
Sets whether User Verification succeeds or fails for an authenticator.
|
|
The default is true.
|
|
|
|
:param authenticator_id:
|
|
:param is_user_verified:
|
|
'''
|
|
params: T_JSON_DICT = dict()
|
|
params['authenticatorId'] = authenticator_id.to_json()
|
|
params['isUserVerified'] = is_user_verified
|
|
cmd_dict: T_JSON_DICT = {
|
|
'method': 'WebAuthn.setUserVerified',
|
|
'params': params,
|
|
}
|
|
json = yield cmd_dict
|