mirror of
https://github.com/bitwarden/server.git
synced 2025-04-13 00:58:13 -05:00
new "Challenge" token for U2f
This commit is contained in:
parent
5a75134cf6
commit
006cfffab3
@ -10,6 +10,7 @@ using System.Linq;
|
|||||||
using U2fLib = U2F.Core.Crypto.U2F;
|
using U2fLib = U2F.Core.Crypto.U2F;
|
||||||
using U2F.Core.Models;
|
using U2F.Core.Models;
|
||||||
using U2F.Core.Exceptions;
|
using U2F.Core.Exceptions;
|
||||||
|
using U2F.Core.Utils;
|
||||||
using System;
|
using System;
|
||||||
using Bit.Core.Services;
|
using Bit.Core.Services;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
@ -69,13 +70,14 @@ namespace Bit.Core.Identity
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var challengeBytes = U2fLib.Crypto.GenerateChallenge();
|
var challengeBytes = U2fLib.Crypto.GenerateChallenge();
|
||||||
var challenges = new List<object>();
|
var appId = Utilities.CoreHelpers.U2fAppIdUrl(_globalSettings);
|
||||||
|
var oldChallenges = new List<object>();
|
||||||
|
var challengeKeys = new List<object>();
|
||||||
foreach(var key in keys)
|
foreach(var key in keys)
|
||||||
{
|
{
|
||||||
var registration = new DeviceRegistration(key.Item2.KeyHandleBytes, key.Item2.PublicKeyBytes,
|
var registration = new DeviceRegistration(key.Item2.KeyHandleBytes, key.Item2.PublicKeyBytes,
|
||||||
key.Item2.CertificateBytes, key.Item2.Counter);
|
key.Item2.CertificateBytes, key.Item2.Counter);
|
||||||
var auth = U2fLib.StartAuthentication(Utilities.CoreHelpers.U2fAppIdUrl(_globalSettings), registration,
|
var auth = U2fLib.StartAuthentication(appId, registration, challengeBytes);
|
||||||
challengeBytes);
|
|
||||||
|
|
||||||
// TODO: Maybe move this to a bulk create?
|
// TODO: Maybe move this to a bulk create?
|
||||||
await _u2fRepository.CreateAsync(new U2f
|
await _u2fRepository.CreateAsync(new U2f
|
||||||
@ -88,7 +90,14 @@ namespace Bit.Core.Identity
|
|||||||
CreationDate = DateTime.UtcNow
|
CreationDate = DateTime.UtcNow
|
||||||
});
|
});
|
||||||
|
|
||||||
challenges.Add(new
|
challengeKeys.Add(new
|
||||||
|
{
|
||||||
|
keyHandle = auth.KeyHandle,
|
||||||
|
version = auth.Version
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: Old challenges array is here for backwards compat. Remove in the future.
|
||||||
|
oldChallenges.Add(new
|
||||||
{
|
{
|
||||||
appId = auth.AppId,
|
appId = auth.AppId,
|
||||||
challenge = auth.Challenge,
|
challenge = auth.Challenge,
|
||||||
@ -97,8 +106,14 @@ namespace Bit.Core.Identity
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var token = JsonConvert.SerializeObject(challenges);
|
var oldToken = JsonConvert.SerializeObject(oldChallenges);
|
||||||
return token;
|
var token = JsonConvert.SerializeObject(new
|
||||||
|
{
|
||||||
|
appId = appId,
|
||||||
|
challenge = challengeBytes.ByteArrayToBase64String(),
|
||||||
|
keys = challengeKeys
|
||||||
|
});
|
||||||
|
return $"{token}|{oldToken}";
|
||||||
}
|
}
|
||||||
catch(U2fException)
|
catch(U2fException)
|
||||||
{
|
{
|
||||||
|
@ -327,9 +327,12 @@ namespace Bit.Core.IdentityServer
|
|||||||
}
|
}
|
||||||
else if(type == TwoFactorProviderType.U2f)
|
else if(type == TwoFactorProviderType.U2f)
|
||||||
{
|
{
|
||||||
|
// TODO: Remove "Challenges" in a future update. Deprecated.
|
||||||
|
var tokens = token?.Split('|');
|
||||||
return new Dictionary<string, object>
|
return new Dictionary<string, object>
|
||||||
{
|
{
|
||||||
["Challenges"] = token
|
["Challenge"] = tokens.Length > 0 ? tokens[0] : null,
|
||||||
|
["Challenges"] = tokens.Length > 1 ? tokens[1] : null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
else if(type == TwoFactorProviderType.Email)
|
else if(type == TwoFactorProviderType.Email)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user