Compare commits

..

No commits in common. "e512edcde5803a59101e42441377bb2745e59f14" and "a58efebb5c77272d854bd0e408374719f945b890" have entirely different histories.

View File

@ -31,37 +31,16 @@ creates a new credential for it, and authenticates the credential.
This works with both FIDO 2.0 devices as well as with U2F devices. This works with both FIDO 2.0 devices as well as with U2F devices.
On Windows, the native WebAuthn API will be used. On Windows, the native WebAuthn API will be used.
""" """
import time
import fido2.webauthn
from fido2.hid import CtapHidDevice from fido2.hid import CtapHidDevice
from fido2.client import Fido2Client, WindowsClient, UserInteraction from fido2.client import Fido2Client, WindowsClient, UserInteraction
from fido2.server import Fido2Server from fido2.server import Fido2Server
from getpass import getpass from getpass import getpass
import sys import sys
import ctypes import ctypes
from fido2.ctap2 import Ctap2
REGISTER = False
gotAaguid = None
while True: # Handle user interaction
while True: class CliInteraction(UserInteraction):
dev = next(CtapHidDevice.list_devices(), None)
if dev:
ctap2 = Ctap2(dev)
info = ctap2.get_info()
gotAaguid = info.aaguid
print(str(gotAaguid))
break
print("Waiting for device...")
time.sleep(0.1)
# Handle user interaction
class CliInteraction(UserInteraction):
def prompt_up(self): def prompt_up(self):
print("\nTouch your authenticator device now...\n") print("\nTouch your authenticator device now...\n")
@ -71,14 +50,14 @@ while True:
def request_uv(self, permissions, rd_id): def request_uv(self, permissions, rd_id):
print("User Verification required.") print("User Verification required.")
return True return True
if REGISTER:
uv = "discouraged"
if WindowsClient.is_available() and not ctypes.windll.shell32.IsUserAnAdmin(): uv = "discouraged"
if WindowsClient.is_available() and not ctypes.windll.shell32.IsUserAnAdmin():
# Use the Windows WebAuthn API if available, and we're not running as admin # Use the Windows WebAuthn API if available, and we're not running as admin
client = WindowsClient("https://example.com") client = WindowsClient("https://example.com")
else: else:
# Locate a device # Locate a device
dev = next(CtapHidDevice.list_devices(), None) dev = next(CtapHidDevice.list_devices(), None)
if dev is not None: if dev is not None:
@ -105,46 +84,46 @@ while True:
print("Authenticator supports User Verification") print("Authenticator supports User Verification")
server = Fido2Server({"id": "example.com", "name": "Example RP"}, attestation="direct") server = Fido2Server({"id": "example.com", "name": "Example RP"}, attestation="direct")
user = {"id": b"user_id", "name": "A. User"} user = {"id": b"user_id", "name": "A. User"}
# Prepare parameters for makeCredential # Prepare parameters for makeCredential
create_options, state = server.register_begin( create_options, state = server.register_begin(
user, user_verification=uv, authenticator_attachment="cross-platform" user, user_verification=uv, authenticator_attachment="cross-platform"
) )
# Create a credential # Create a credential
result = client.make_credential(create_options["publicKey"]) result = client.make_credential(create_options["publicKey"])
# Complete registration # Complete registration
auth_data = server.register_complete( auth_data = server.register_complete(
state, result.client_data, result.attestation_object state, result.client_data, result.attestation_object
) )
credentials = [auth_data.credential_data] credentials = [auth_data.credential_data]
AAGUID = auth_data.credential_data.aaguid AAGUID = auth_data.credential_data.aaguid
cred_id = auth_data.credential_data.credential_id cred_id = auth_data.credential_data.credential_id
pk_algo = auth_data.credential_data.public_key.ALGORITHM pk_algo = auth_data.credential_data.public_key.ALGORITHM
pk_1 = auth_data.credential_data.public_key.get(1) pk_1 = auth_data.credential_data.public_key.get(1)
pk_3 = auth_data.credential_data.public_key.get(3) pk_3 = auth_data.credential_data.public_key.get(3)
pk__1 = auth_data.credential_data.public_key.get(-1) pk__1 = auth_data.credential_data.public_key.get(-1)
pk__2 = auth_data.credential_data.public_key.get(-2) pk__2 = auth_data.credential_data.public_key.get(-2)
pk__3 = auth_data.credential_data.public_key.get(-3) pk__3 = auth_data.credential_data.public_key.get(-3)
import psycopg2 import psycopg2
# Replace these variables with your connection parameters # Replace these variables with your connection parameters
dbname = "CNSA-276-FP-DAS" dbname = "CNSA-276-FP-DAS"
user = "FP-DEV-USER" user = "FP-DEV-USER"
password = "purchase-immortal-prescribe-repave-detention-seizing-candied-antiques-episode-list" password = "purchase-immortal-prescribe-repave-detention-seizing-candied-antiques-episode-list"
host = "postgres.eggtech.net" host = "postgres.eggtech.net"
# Function to connect to the PostgreSQL database and insert data # Function to connect to the PostgreSQL database and insert data
def insert_data(aaguid, cred_id, pk_algo, pk_1, pk_3, pk__1, pk__2, pk__3): def insert_data(aaguid, cred_id, pk_algo, pk_1, pk_3, pk__1, pk__2, pk__3):
conn = None conn = None
try: try:
# Connect to the PostgreSQL server # Connect to the PostgreSQL server
@ -170,8 +149,8 @@ while True:
if conn is not None: if conn is not None:
conn.close() conn.close()
# Assuming auth_data is defined and you've extracted your data as you've shown above # Assuming auth_data is defined and you've extracted your data as you've shown above
insert_data( insert_data(
AAGUID, AAGUID,
cred_id, cred_id,
pk_algo, pk_algo,
@ -180,115 +159,29 @@ while True:
pk__1, pk__1,
pk__2, pk__2,
pk__3 pk__3
) )
print("New credential created!") print("New credential created!")
print("CLIENT DATA:", result.client_data) print("CLIENT DATA:", result.client_data)
print("ATTESTATION OBJECT:", result.attestation_object) print("ATTESTATION OBJECT:", result.attestation_object)
print() print()
print("CREDENTIAL DATA:", auth_data.credential_data) print("CREDENTIAL DATA:", auth_data.credential_data)
else:
server = Fido2Server({"id": "example.com", "name": "Example RP"}, attestation="direct")
uv = "discouraged"
# Set up a FIDO 2 client using the origin https://example.com
client = Fido2Client(dev, "https://example.com", user_interaction=CliInteraction())
import psycopg2
# Replace these variables with your connection parameters
dbname = "CNSA-276-FP-DAS"
user = "FP-DEV-USER"
password = "purchase-immortal-prescribe-repave-detention-seizing-candied-antiques-episode-list"
host = "postgres.eggtech.net"
# Define the SQL query for retrieving data
select_query = '''
SELECT "AAGUID", credential_id, pk_algo, pk_1, pk_3, pk_neg1, pk_neg2, pk_neg3
FROM credential_data
WHERE "AAGUID" = %s;
'''
# Function to connect to the PostgreSQL database and retrieve data # Prepare parameters for getAssertion
def fetch_data(aaguid): request_options, state = server.authenticate_begin(credentials, user_verification=uv)
conn = None
try:
# Connect to the PostgreSQL server
conn = psycopg2.connect(dbname=dbname, user=user, password=password, host=host)
cur = conn.cursor()
# Execute the SQL query # Authenticate the credential
cur.execute(select_query, (gotAaguid,)) result = client.get_assertion(request_options["publicKey"])
# Fetch the results # Only one cred in allowCredentials, only one response.
result = cur.fetchone() result = result.get_response(0)
if result:
data = {
"AAGUID": result[0],
"credential_id": result[1],
"pk_algo": result[2],
"pk_1": result[3],
"pk_3": result[4],
"pk_neg1": result[5],
"pk_neg2": result[6],
"pk_neg3": result[7]
}
return data
else:
print("No data found for AAGUID:", aaguid)
return None
# Close communication with the database # Complete authenticator
cur.close() server.authenticate_complete(
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
# Example usage: Fetch data for a specific AAGUID and store in variables
aaguid_data = fetch_data("your_specific_aaguid_here")
if aaguid_data:
# Store each piece of data into a separate variable
testa = aaguid_data["AAGUID"]
cred_id = aaguid_data["credential_id"]
pk_algo = aaguid_data["pk_algo"]
pk_1 = aaguid_data["pk_1"]
pk_3 = aaguid_data["pk_3"]
pk_neg1 = aaguid_data["pk_neg1"]
pk_neg2 = aaguid_data["pk_neg2"]
pk_neg3 = aaguid_data["pk_neg3"]
auth_data = fido2.webauthn.AttestedCredentialData(testa, cred_id, pk_algo)
# auth_data.aaguid = AAGUID
# auth_data.credential_id = cred_id
# auth_data.public_key.ALGORITHM= pk_algo
# auth_data.public_key.setdefault(1, pk_1)
# auth_data.public_key.setdefault(3, pk_3)
# auth_data.public_key.setdefault(-1, pk__1)
# auth_data.public_key.setdefault(-2, pk__2)
# auth_data.public_key.setdefault(-3,pk__3)
credentials = [auth_data]
# Prepare parameters for getAssertion
request_options, state = server.authenticate_begin(credentials, user_verification=uv)
# Authenticate the credential
result = client.get_assertion(request_options["publicKey"])
# Only one cred in allowCredentials, only one response.
result = result.get_response(0)
# Complete authenticator
server.authenticate_complete(
state, state,
credentials, credentials,
@ -296,10 +189,10 @@ while True:
result.client_data, result.client_data,
result.authenticator_data, result.authenticator_data,
result.signature, result.signature,
) )
print("Credential authenticated!") print("Credential authenticated!")
print("CLIENT DATA:", result.client_data) print("CLIENT DATA:", result.client_data)
print() print()
print("AUTH DATA:", result.authenticator_data) print("AUTH DATA:", result.authenticator_data)