Skip to content

Commit 963776a

Browse files
NFC-99 Add web-eid-1.1 token support
Signed-off-by: Sander Kondratjev <[email protected]>
1 parent 762501b commit 963776a

22 files changed

+1327
-135
lines changed

src/WebEid.Security.Tests/TestUtils/AbstractTestWithValidator.cs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@ public abstract class AbstractTestWithValidator
3434
"\"appVersion\":\"https://web-eid.eu/web-eid-app/releases/2.0.0+0\"," +
3535
"\"signature\":\"tbMTrZD4CKUj6atjNCHZruIeyPFAEJk2htziQ1t08BSTyA5wKKqmNmzsJ7562hWQ6+tJd6nlidHGE5jVVJRKmPtNv3f9gbT2b7RXcD4t5Pjn8eUCBCA4IX99Af32Z5ln\"," +
3636
"\"format\":\"web-eid:1\"}";
37+
38+
protected const string ValidV11AuthTokenStr = "{\"algorithm\":\"ES384\"," +
39+
"\"unverifiedCertificate\":\"MIIEBDCCA2WgAwIBAgIQY5OGshxoPMFg+Wfc0gFEaTAKBggqhkjOPQQDBDBgMQswCQYDVQQGEwJFRTEbMBkGA1UECgwSU0sgSUQgU29sdXRpb25zIEFTMRcwFQYDVQRhDA5OVFJFRS0xMDc0NzAxMzEbMBkGA1UEAwwSVEVTVCBvZiBFU1RFSUQyMDE4MB4XDTIxMDcyMjEyNDMwOFoXDTI2MDcwOTIxNTk1OVowfzELMAkGA1UEBhMCRUUxKjAoBgNVBAMMIUrDlUVPUkcsSkFBSy1LUklTVEpBTiwzODAwMTA4NTcxODEQMA4GA1UEBAwHSsOVRU9SRzEWMBQGA1UEKgwNSkFBSy1LUklTVEpBTjEaMBgGA1UEBRMRUE5PRUUtMzgwMDEwODU3MTgwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQmwEKsJTjaMHSaZj19hb9EJaJlwbKc5VFzmlGMFSJVk4dDy+eUxa5KOA7tWXqzcmhh5SYdv+MxcaQKlKWLMa36pfgv20FpEDb03GCtLqjLTRZ7649PugAQ5EmAqIic29CjggHDMIIBvzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIDiDBHBgNVHSAEQDA+MDIGCysGAQQBg5EhAQIBMCMwIQYIKwYBBQUHAgEWFWh0dHBzOi8vd3d3LnNrLmVlL0NQUzAIBgYEAI96AQIwHwYDVR0RBBgwFoEUMzgwMDEwODU3MThAZWVzdGkuZWUwHQYDVR0OBBYEFPlp/ceABC52itoqppEmbf71TJz6MGEGCCsGAQUFBwEDBFUwUzBRBgYEAI5GAQUwRzBFFj9odHRwczovL3NrLmVlL2VuL3JlcG9zaXRvcnkvY29uZGl0aW9ucy1mb3ItdXNlLW9mLWNlcnRpZmljYXRlcy8TAkVOMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAfBgNVHSMEGDAWgBTAhJkpxE6fOwI09pnhClYACCk+ezBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0dHA6Ly9haWEuZGVtby5zay5lZS9lc3RlaWQyMDE4MDUGCCsGAQUFBzAChilodHRwOi8vYy5zay5lZS9UZXN0X29mX0VTVEVJRDIwMTguZGVyLmNydDAKBggqhkjOPQQDBAOBjAAwgYgCQgDCAgybz0u3W+tGI+AX+PiI5CrE9ptEHO5eezR1Jo4j7iGaO0i39xTGUB+NSC7P6AQbyE/ywqJjA1a62jTLcS9GHAJCARxN4NO4eVdWU3zVohCXm8WN3DWA7XUcn9TZiLGQ29P4xfQZOXJi/z4PNRRsR4plvSNB3dfyBvZn31HhC7my8woi\"," +
40+
"\"unverifiedSigningCertificate\":\"MIID6zCCA02gAwIBAgIQT7j6zk6pmVRcyspLo5SqejAKBggqhkjOPQQDBDBgMQswCQYDVQQGEwJFRTEbMBkGA1UECgwSU0sgSUQgU29sdXRpb25zIEFTMRcwFQYDVQRhDA5OVFJFRS0xMDc0NzAxMzEbMBkGA1UEAwwSVEVTVCBvZiBFU1RFSUQyMDE4MB4XDTE5MDUwMjEwNDUzMVoXDTI5MDUwMjEwNDUzMVowfzELMAkGA1UEBhMCRUUxFjAUBgNVBCoMDUpBQUstS1JJU1RKQU4xEDAOBgNVBAQMB0rDlUVPUkcxKjAoBgNVBAMMIUrDlUVPUkcsSkFBSy1LUklTVEpBTiwzODAwMTA4NTcxODEaMBgGA1UEBRMRUE5PRUUtMzgwMDEwODU3MTgwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASkwENR8GmCpEs6OshDWDfIiKvGuyNMOD2rjIQW321AnZD3oIsqD0svBMNEJJj9Dlvq/47TYDObIa12KAU5IuOBfJs2lrFdSXZjaM+a5TWT3O2JTM36YDH2GcMe/eisepejggGrMIIBpzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIGQDBIBgNVHSAEQTA/MDIGCysGAQQBg5EhAQIBMCMwIQYIKwYBBQUHAgEWFWh0dHBzOi8vd3d3LnNrLmVlL0NQUzAJBgcEAIvsQAECMB0GA1UdDgQWBBTVX3s48Spy/Es2TcXgkRvwUn2YcjCBigYIKwYBBQUHAQMEfjB8MAgGBgQAjkYBATAIBgYEAI5GAQQwEwYGBACORgEGMAkGBwQAjkYBBgEwUQYGBACORgEFMEcwRRY/aHR0cHM6Ly9zay5lZS9lbi9yZXBvc2l0b3J5L2NvbmRpdGlvbnMtZm9yLXVzZS1vZi1jZXJ0aWZpY2F0ZXMvEwJFTjAfBgNVHSMEGDAWgBTAhJkpxE6fOwI09pnhClYACCk+ezBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0dHA6Ly9haWEuZGVtby5zay5lZS9lc3RlaWQyMDE4MDUGCCsGAQUFBzAChilodHRwOi8vYy5zay5lZS9UZXN0X29mX0VTVEVJRDIwMTguZGVyLmNydDAKBggqhkjOPQQDBAOBiwAwgYcCQgGBr+Jbo1GeqgWdIwgMo7SA29AP38JxNm2HWq2Qb+kIHpusAK574Co1K5D4+Mk7/ITTuXQaET5WphHoN7tdAciTaQJBAn0zBigYyVPYSTO68HM6hmlwTwi/KlJDdXW/2NsMjSqofFFJXpGvpxk2CTqSRCjcavxLPnkasTbNROYSJcmM8Xc=\"," +
41+
"\"supportedSignatureAlgorithms\":[{\"cryptoAlgorithm\":\"RSA\",\"hashFunction\":\"SHA-256\",\"paddingScheme\":\"PKCS1.5\"}]," +
42+
"\"appVersion\":\"https://web-eid.eu/web-eid-mobile-app/releases/v1.0.0\"," +
43+
"\"signature\":\"0Ov7ME6pTY1K2GXMj8Wxov/o2fGIMEds8OMY5dKdkB0nrqQX7fG1E5mnsbvyHpMDecMUH6Yg+p1HXdgB/lLqOcFZjt/OVXPjAAApC5d1YgRYATDcxsR1zqQwiNcHdmWn\"," +
44+
"\"format\":\"web-eid:1.1\"}";
45+
3746
public const string ValidChallengeNonce = "12345678123456781234567812345678912356789123";
3847

3948
private DateTimeProvider dateTimeProvider;
@@ -44,15 +53,22 @@ public abstract class AbstractTestWithValidator
4453
[SetUp]
4554
protected void SetUp()
4655
{
47-
this.Validator = AuthTokenValidators.GetAuthTokenValidator();
48-
this.ValidAuthToken = this.Validator.Parse(ValidAuthTokenStr);
49-
this.dateTimeProvider = DateTimeProvider.OverrideUtcNow(new DateTime(2021, 3, 1));
56+
Validator = AuthTokenValidators.GetAuthTokenValidator();
57+
ValidAuthToken = Validator.Parse(ValidAuthTokenStr);
58+
dateTimeProvider = DateTimeProvider.OverrideUtcNow(new DateTime(2021, 8, 1));
5059
}
5160

5261
[TearDown]
53-
public void TearDown() => this.dateTimeProvider?.Dispose();
62+
public void TearDown() => dateTimeProvider?.Dispose();
5463

5564
protected WebEidAuthToken ReplaceTokenField(string token, string field, string value) =>
56-
this.Validator.Parse(token.Replace(field, value));
65+
Validator.Parse(token.Replace(field, value));
66+
67+
protected string RemoveJsonField(string json, string fieldName)
68+
{
69+
var node = Newtonsoft.Json.Linq.JObject.Parse(json);
70+
node.Remove(fieldName);
71+
return node.ToString(Newtonsoft.Json.Formatting.None);
72+
}
5773
}
5874
}

src/WebEid.Security.Tests/Validator/AuthTokenAlgorithmTest.cs

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,33 +22,77 @@
2222
namespace WebEid.Security.Tests.Validator
2323
{
2424
using NUnit.Framework;
25-
using WebEid.Security.Exceptions;
26-
using WebEid.Security.Tests.TestUtils;
25+
using Exceptions;
26+
using TestUtils;
2727

2828
public class AuthTokenAlgorithmTest : AbstractTestWithValidator
2929
{
3030
[Test]
3131
public void WhenAlgorithmNoneThenValidationFailsAsync()
3232
{
33-
var authToken = this.ReplaceTokenField(ValidAuthTokenStr, "ES384", "NONE");
34-
Assert.ThrowsAsync<AuthTokenParseException>(() => this.Validator.Validate(authToken, ValidChallengeNonce))
33+
var authToken = ReplaceTokenField(ValidAuthTokenStr, "ES384", "NONE");
34+
Assert.ThrowsAsync<AuthTokenParseException>(() => Validator.Validate(authToken, ValidChallengeNonce))
3535
.WithMessage("Unsupported signature algorithm");
3636
}
3737

3838
[Test]
3939
public void WhenAlgorithmEmptyThenParsingFailsAsync()
4040
{
41-
var authToken = this.ReplaceTokenField(ValidAuthTokenStr, "ES384", "");
42-
Assert.ThrowsAsync<AuthTokenParseException>(() => this.Validator.Validate(authToken, ValidChallengeNonce))
41+
var authToken = ReplaceTokenField(ValidAuthTokenStr, "ES384", "");
42+
Assert.ThrowsAsync<AuthTokenParseException>(() => Validator.Validate(authToken, ValidChallengeNonce))
4343
.WithMessage("'algorithm' is null or empty");
4444
}
4545

4646
[Test]
4747
public void WhenAlgorithmInvalidThenParsingFailsAsync()
4848
{
49-
var authToken = this.ReplaceTokenField(ValidAuthTokenStr, "ES384", "\u0000\t\ninvalid");
50-
Assert.ThrowsAsync<AuthTokenParseException>(() => this.Validator.Validate(authToken, ValidChallengeNonce))
49+
var authToken = ReplaceTokenField(ValidAuthTokenStr, "ES384", "\u0000\t\ninvalid");
50+
Assert.ThrowsAsync<AuthTokenParseException>(() => Validator.Validate(authToken, ValidChallengeNonce))
5151
.WithMessage("Unsupported signature algorithm");
5252
}
53+
54+
[Test]
55+
public void WhenV11TokenMissingSupportedAlgorithmsThenValidationFailsAsync()
56+
{
57+
var tokenJson = RemoveJsonField(ValidV11AuthTokenStr, "supportedSignatureAlgorithms");
58+
var token = Validator.Parse(tokenJson);
59+
60+
var ex = Assert.ThrowsAsync<AuthTokenParseException>(() =>
61+
Validator.Validate(token, ValidChallengeNonce));
62+
63+
Assert.That(ex.Message, Does.Contain("'supportedSignatureAlgorithms' field is missing"));
64+
}
65+
66+
[Test]
67+
public void WhenV11TokenHasInvalidCryptoAlgorithmThenValidationFailsAsync()
68+
{
69+
var token = ReplaceTokenField(ValidV11AuthTokenStr, "\"cryptoAlgorithm\":\"RSA\"", "\"cryptoAlgorithm\":\"INVALID\"");
70+
Assert.ThrowsAsync<AuthTokenParseException>(() => Validator.Validate(token, ValidChallengeNonce))
71+
.WithMessage("Unsupported signature algorithm");
72+
}
73+
74+
[Test]
75+
public void WhenV11TokenHasInvalidHashFunctionThenValidationFailsAsync()
76+
{
77+
var token = ReplaceTokenField( ValidV11AuthTokenStr, "\"hashFunction\":\"SHA-256\"", "\"hashFunction\":\"NOT_A_HASH\"");
78+
Assert.ThrowsAsync<AuthTokenParseException>(() => Validator.Validate(token, ValidChallengeNonce))
79+
.WithMessage("Unsupported signature algorithm");
80+
}
81+
82+
[Test]
83+
public void WhenV11TokenHasInvalidPaddingSchemeThenValidationFailsAsync()
84+
{
85+
var token = ReplaceTokenField( ValidV11AuthTokenStr, "\"paddingScheme\":\"PKCS1.5\"", "\"paddingScheme\":\"BAD_PADDING\"");
86+
Assert.ThrowsAsync<AuthTokenParseException>(() => Validator.Validate(token, ValidChallengeNonce))
87+
.WithMessage("Unsupported signature algorithm");
88+
}
89+
90+
[Test]
91+
public void WhenV11TokenHasEmptySupportedAlgorithmsThenValidationFailsAsync()
92+
{
93+
var token = ReplaceTokenField( ValidV11AuthTokenStr, "\"supportedSignatureAlgorithms\":[{\"cryptoAlgorithm\":\"RSA\",\"hashFunction\":\"SHA-256\",\"paddingScheme\":\"PKCS1.5\"}]", "\"supportedSignatureAlgorithms\":[]");
94+
Assert.ThrowsAsync<AuthTokenParseException>(() => Validator.Validate(token, ValidChallengeNonce))
95+
.WithMessage("'supportedSignatureAlgorithms' field is missing");
96+
}
5397
}
5498
}

0 commit comments

Comments
 (0)