Skip to content

Commit 3535558

Browse files
committed
fix calculation of clientDataJson (add missing crossOrigin, fix querying of package id)
1 parent 1e14dbd commit 3535558

2 files changed

Lines changed: 13 additions & 26 deletions

File tree

src/Kp2aPasskey.Core/AuthenticatorResponses.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ public ClientDataBuildResponse(RequestType type, byte[] challenge, string origin
158158
_clientDataJson.Put("type", type == RequestType.Create ? "webauthn.create" : "webauthn.get");
159159
_clientDataJson.Put("challenge", Base64EncodeUrlSafe(challenge));
160160
_clientDataJson.Put("origin", origin);
161+
_clientDataJson.Put("crossOrigin", false);
161162
}
162163

163164
public byte[] HashData()

src/keepass2android-app/services/Kp2aCredentialProvider/PasskeyOptionParsingHelper.cs

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -74,47 +74,33 @@ public static string GetOriginForCallingApp(CallingAppInfo? callingAppInfo)
7474

7575
try
7676
{
77-
var packageManager = Application.Context.PackageManager;
78-
79-
var packageInfo = packageManager?.GetPackageInfo(
80-
callingAppInfo.PackageName,
81-
PackageInfoFlags.Signatures
82-
);
83-
84-
if (packageInfo?.Signatures == null || packageInfo.Signatures.Count == 0)
77+
// Use the SigningInfo the framework already attached to CallingAppInfo
78+
var signers = callingAppInfo.SigningInfo?.GetApkContentsSigners();
79+
if (signers == null || signers.Length == 0)
8580
{
81+
Kp2aLog.Log($"GetOriginForCallingApp: no signers in CallingAppInfo.SigningInfo for {callingAppInfo.PackageName}");
8682
return AppKeyHashStringPrefix;
8783
}
8884

89-
// Get the first signature and extract the X.509 certificate
90-
var signature = packageInfo.Signatures[0];
91-
92-
// Parse the X.509 certificate from the signature (same as KeePassDX)
93-
var certFactory = Java.Security.Cert.CertificateFactory.GetInstance("X.509");
94-
var signatureBytes = signature.ToByteArray();
95-
using var memStream = new MemoryStream(signatureBytes);
96-
var x509Cert = (Java.Security.Cert.X509Certificate)certFactory.GenerateCertificate(memStream);
97-
98-
// Hash the DER-encoded certificate (not the signature!)
85+
// signers[0].ToByteArray() returns the raw DER-encoded X.509 certificate bytes
86+
var certDer = signers[0].ToByteArray();
9987
using var sha256 = System.Security.Cryptography.SHA256.Create();
100-
var certEncoded = x509Cert?.GetEncoded();
101-
if (certEncoded == null)
102-
{
103-
return AppKeyHashStringPrefix;
104-
}
105-
var hash = sha256.ComputeHash(certEncoded);
88+
var hash = sha256.ComputeHash(certDer);
10689
var base64Hash = Base64.EncodeToString(
10790
hash,
10891
Base64Flags.UrlSafe | Base64Flags.NoPadding | Base64Flags.NoWrap
10992
);
11093

111-
return $"{AppKeyHashStringPrefix}{base64Hash}";
94+
var origin = $"{AppKeyHashStringPrefix}{base64Hash}";
95+
Kp2aLog.Log($"GetOriginForCallingApp: {callingAppInfo.PackageName} -> {origin}");
96+
return origin;
11297
}
11398
catch (Exception e)
11499
{
115-
Kp2aLog.Log($"Error getting origin for {callingAppInfo.PackageName}: {e.Message}");
100+
Kp2aLog.Log($"GetOriginForCallingApp: error for {callingAppInfo.PackageName}: {e}");
116101
return AppKeyHashStringPrefix;
117102
}
118103
}
119104
}
105+
120106
}

0 commit comments

Comments
 (0)