blob: 9df9ec1f6beaccd415cbdaf7d8e46780b46e17a7 [file] [log] [blame] [edit]
// <copyright file="DesiredCapabilities.cs" company="WebDriver Committers">
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
using System.Collections.Generic;
using Microsoft.IdentityModel.Tokens;
namespace OpenQA.Selenium.VirtualAuth
{
/// <summary>
/// A credential stored in a virtual authenticator.
/// Refer https://w3c.github.io/webauthn/#credential-parameters
/// </summary>
public class Credential
{
private readonly byte[] id;
private readonly bool isResidentCredential;
private readonly string rpId;
private readonly string privateKey;
private readonly byte[] userHandle;
private readonly int signCount;
private Credential(
byte[] id,
bool isResidentCredential,
string rpId,
string privateKey,
byte[] userHandle,
int signCount)
{
this.id = id;
this.isResidentCredential = isResidentCredential;
this.rpId = rpId;
this.privateKey = privateKey;
this.userHandle = userHandle;
this.signCount = signCount;
}
public static Credential CreateNonResidentCredential(
byte[] id,
string rpId,
string privateKey,
int signCount)
{
return new Credential(id, false, rpId, privateKey, null, signCount);
}
public static Credential CreateResidentCredential(
byte[] id,
string rpId,
string privateKey,
byte[] userHandle,
int signCount)
{
return new Credential(
id,
true,
rpId,
privateKey,
userHandle,
signCount);
}
public byte[] Id
{
get { return (byte[])id.Clone(); }
}
public bool IsResidentCredential
{
get { return this.isResidentCredential; }
}
public string RpId
{
get { return this.rpId; }
}
public string PrivateKey
{
get { return this.privateKey; }
}
public byte[] UserHandle
{
get { return userHandle == null ? null : (byte[])userHandle.Clone(); }
}
public int SignCount
{
get { return this.signCount; }
}
public static Credential FromDictionary(Dictionary<string, object> dictionary)
{
return new Credential(
Base64UrlEncoder.DecodeBytes((string)dictionary["credentialId"]),
(bool)dictionary["isResidentCredential"],
dictionary.ContainsKey("rpId") ? (string)dictionary["rpId"] : null,
(string)dictionary["privateKey"],
dictionary.ContainsKey("userHandle") ? Base64UrlEncoder.DecodeBytes((string)dictionary["userHandle"]) : null,
(int)((long)dictionary["signCount"]));
}
public Dictionary<string, object> ToDictionary()
{
Dictionary<string, object> toReturn = new Dictionary<string, object>();
toReturn["credentialId"] = Base64UrlEncoder.Encode(this.id);
toReturn["isResidentCredential"] = this.isResidentCredential;
toReturn["rpId"] = this.rpId;
toReturn["privateKey"] = this.privateKey;
toReturn["signCount"] = this.signCount;
if (this.userHandle != null)
{
toReturn["userHandle"] = Base64UrlEncoder.Encode(this.userHandle);
}
return toReturn;
}
}
}