adding brand new tests

This commit is contained in:
Jonas Roussel
2023-09-30 19:59:00 +02:00
parent 8b162293d5
commit f8470437ee
6 changed files with 541 additions and 25 deletions

52
.github/workspaces/publish-ci.yml vendored Normal file
View File

@ -0,0 +1,52 @@
name: Publish CI
on:
push:
tags:
- "v[0-9]+.[0-9]+.[0-9]+*"
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dart-lang/setup-dart@v1
- name: Install dependencies
run: dart pub get
- name: Check formatting
run: dart format --output=none --set-exit-if-changed .
- name: Analyze code
run: dart analyze --fatal-infos
test:
needs: analyze
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dart-lang/setup-dart@v1
- name: Install dependencies
run: dart pub get
- name: Run tests
run: dart test -p chrome,vm --test-randomize-ordering-seed=random
publish:
needs: test
runs-on: ubuntu-latest
permissions:
id-token: write
steps:
- uses: actions/checkout@v3
- uses: dart-lang/setup-dart@v1
- name: Install dependencies
run: dart pub get
- name: Publish - dry run
run: dart pub publish --dry-run
- name: Publish to pub.dev
run: dart pub publish -f

33
.github/workspaces/tests-ci.yml vendored Normal file
View File

@ -0,0 +1,33 @@
name: Tests CI
on:
pull_request:
types: [opened, synchronize]
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dart-lang/setup-dart@v1
- name: Install dependencies
run: dart pub get
- name: Check formatting
run: dart format --output=none --set-exit-if-changed .
- name: Analyze code
run: dart analyze --fatal-infos
test:
needs: analyze
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dart-lang/setup-dart@v1
- name: Install dependencies
run: dart pub get
- name: Run tests
run: dart test -p chrome,vm --test-randomize-ordering-seed=random

View File

@ -12,46 +12,46 @@ import 'helpers.dart';
abstract class JWTAlgorithm {
/// HMAC using SHA-256 hash algorithm
static const HS256 = _HMACAlgorithm('HS256');
static const HS256 = HMACAlgorithm('HS256');
/// HMAC using SHA-384 hash algorithm
static const HS384 = _HMACAlgorithm('HS384');
static const HS384 = HMACAlgorithm('HS384');
/// HMAC using SHA-512 hash algorithm
static const HS512 = _HMACAlgorithm('HS512');
static const HS512 = HMACAlgorithm('HS512');
/// RSASSA-PSS using SHA-256 hash algorithm
static const PS256 = _RSAAlgorithm('PS256');
static const PS256 = RSAAlgorithm('PS256', null);
/// RSASSA-PSS using SHA-384 hash algorithm
static const PS384 = _RSAAlgorithm('PS384');
static const PS384 = RSAAlgorithm('PS384', null);
/// RSASSA-PSS using SHA-512 hash algorithm
static const PS512 = _RSAAlgorithm('PS512');
static const PS512 = RSAAlgorithm('PS512', null);
/// RSASSA-PKCS1-v1_5 using SHA-256 hash algorithm
static const RS256 = _RSAAlgorithm('RS256');
static const RS256 = RSAAlgorithm('RS256', null);
/// RSASSA-PKCS1-v1_5 using SHA-384 hash algorithm
static const RS384 = _RSAAlgorithm('RS384');
static const RS384 = RSAAlgorithm('RS384', null);
/// RSASSA-PKCS1-v1_5 using SHA-512 hash algorithm
static const RS512 = _RSAAlgorithm('RS512');
static const RS512 = RSAAlgorithm('RS512', null);
/// ECDSA using P-256 curve and SHA-256 hash algorithm
static const ES256 = _ECDSAAlgorithm('ES256');
static const ES256 = ECDSAAlgorithm('ES256');
/// ECDSA using P-384 curve and SHA-384 hash algorithm
static const ES384 = _ECDSAAlgorithm('ES384');
static const ES384 = ECDSAAlgorithm('ES384');
/// ECDSA using P-512 curve and SHA-512 hash algorithm
static const ES512 = _ECDSAAlgorithm('ES512');
static const ES512 = ECDSAAlgorithm('ES512');
/// ECDSA using secp256k1 curve and SHA-256 hash algorithm
static const ES256K = _ECDSAAlgorithm('ES256K');
static const ES256K = ECDSAAlgorithm('ES256K');
/// EdDSA using Ed25519 curve algorithm
static const EdDSA = _EdDSAAlgorithm('EdDSA');
static const EdDSA = EdDSAAlgorithm('EdDSA');
/// Return the `JWTAlgorithm` from his string name
static JWTAlgorithm fromName(String name) {
@ -105,10 +105,10 @@ abstract class JWTAlgorithm {
bool verify(JWTKey key, Uint8List body, Uint8List signature);
}
class _EdDSAAlgorithm extends JWTAlgorithm {
class EdDSAAlgorithm extends JWTAlgorithm {
final String _name;
const _EdDSAAlgorithm(this._name);
const EdDSAAlgorithm(this._name);
@override
String get name => _name;
@ -134,10 +134,10 @@ class _EdDSAAlgorithm extends JWTAlgorithm {
}
}
class _HMACAlgorithm extends JWTAlgorithm {
class HMACAlgorithm extends JWTAlgorithm {
final String _name;
const _HMACAlgorithm(this._name);
const HMACAlgorithm(this._name);
@override
String get name => _name;
@ -181,10 +181,11 @@ class _HMACAlgorithm extends JWTAlgorithm {
}
}
class _RSAAlgorithm extends JWTAlgorithm {
class RSAAlgorithm extends JWTAlgorithm {
final String _name;
final Random? _random;
const _RSAAlgorithm(this._name);
const RSAAlgorithm(this._name, this._random);
@override
String get name => _name;
@ -202,9 +203,10 @@ class _RSAAlgorithm extends JWTAlgorithm {
);
if (algorithm == 'PSS') {
final random = Random.secure();
final salt =
Uint8List.fromList(List.generate(32, (_) => random.nextInt(256)));
final random = _random ?? Random.secure();
final salt = Uint8List.fromList(
List.generate(32, (_) => random.nextInt(256)),
);
params = pc.ParametersWithSalt(
params,
@ -294,10 +296,10 @@ class _RSAAlgorithm extends JWTAlgorithm {
}
}
class _ECDSAAlgorithm extends JWTAlgorithm {
class ECDSAAlgorithm extends JWTAlgorithm {
final String _name;
const _ECDSAAlgorithm(this._name);
const ECDSAAlgorithm(this._name);
@override
String get name => _name;

View File

@ -9,6 +9,7 @@ environment:
false_secrets:
- /example/*.pem
- /test/*
dependencies:
crypto: ^3.0.3
@ -19,3 +20,4 @@ dependencies:
dev_dependencies:
lints: ^2.1.1
test: ^1.24.6

227
test/sign_test.dart Normal file
View File

@ -0,0 +1,227 @@
import 'dart:convert';
import 'dart:math';
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'package:test/test.dart';
final hsKey = SecretKey('secret passphrase');
final rsaKey = RSAPrivateKey('''-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC7VJTUt9Us8cKj
MzEfYyjiWA4R4/M2bS1GB4t7NXp98C3SC6dVMvDuictGeurT8jNbvJZHtCSuYEvu
NMoSfm76oqFvAp8Gy0iz5sxjZmSnXyCdPEovGhLa0VzMaQ8s+CLOyS56YyCFGeJZ
qgtzJ6GR3eqoYSW9b9UMvkBpZODSctWSNGj3P7jRFDO5VoTwCQAWbFnOjDfH5Ulg
p2PKSQnSJP3AJLQNFNe7br1XbrhV//eO+t51mIpGSDCUv3E0DDFcWDTH9cXDTTlR
ZVEiR2BwpZOOkE/Z0/BVnhZYL71oZV34bKfWjQIt6V/isSMahdsAASACp4ZTGtwi
VuNd9tybAgMBAAECggEBAKTmjaS6tkK8BlPXClTQ2vpz/N6uxDeS35mXpqasqskV
laAidgg/sWqpjXDbXr93otIMLlWsM+X0CqMDgSXKejLS2jx4GDjI1ZTXg++0AMJ8
sJ74pWzVDOfmCEQ/7wXs3+cbnXhKriO8Z036q92Qc1+N87SI38nkGa0ABH9CN83H
mQqt4fB7UdHzuIRe/me2PGhIq5ZBzj6h3BpoPGzEP+x3l9YmK8t/1cN0pqI+dQwY
dgfGjackLu/2qH80MCF7IyQaseZUOJyKrCLtSD/Iixv/hzDEUPfOCjFDgTpzf3cw
ta8+oE4wHCo1iI1/4TlPkwmXx4qSXtmw4aQPz7IDQvECgYEA8KNThCO2gsC2I9PQ
DM/8Cw0O983WCDY+oi+7JPiNAJwv5DYBqEZB1QYdj06YD16XlC/HAZMsMku1na2T
N0driwenQQWzoev3g2S7gRDoS/FCJSI3jJ+kjgtaA7Qmzlgk1TxODN+G1H91HW7t
0l7VnL27IWyYo2qRRK3jzxqUiPUCgYEAx0oQs2reBQGMVZnApD1jeq7n4MvNLcPv
t8b/eU9iUv6Y4Mj0Suo/AU8lYZXm8ubbqAlwz2VSVunD2tOplHyMUrtCtObAfVDU
AhCndKaA9gApgfb3xw1IKbuQ1u4IF1FJl3VtumfQn//LiH1B3rXhcdyo3/vIttEk
48RakUKClU8CgYEAzV7W3COOlDDcQd935DdtKBFRAPRPAlspQUnzMi5eSHMD/ISL
DY5IiQHbIH83D4bvXq0X7qQoSBSNP7Dvv3HYuqMhf0DaegrlBuJllFVVq9qPVRnK
xt1Il2HgxOBvbhOT+9in1BzA+YJ99UzC85O0Qz06A+CmtHEy4aZ2kj5hHjECgYEA
mNS4+A8Fkss8Js1RieK2LniBxMgmYml3pfVLKGnzmng7H2+cwPLhPIzIuwytXywh
2bzbsYEfYx3EoEVgMEpPhoarQnYPukrJO4gwE2o5Te6T5mJSZGlQJQj9q4ZB2Dfz
et6INsK0oG8XVGXSpQvQh3RUYekCZQkBBFcpqWpbIEsCgYAnM3DQf3FJoSnXaMhr
VBIovic5l0xFkEHskAjFTevO86Fsz1C2aSeRKSqGFoOQ0tmJzBEs1R6KqnHInicD
TQrKhArgLXX4v3CddjfTRJkFWDbE/CkvKZNOrcf1nhaGCPspRJj2KUkj1Fhl9Cnc
dn/RsYEONbwQSjIfMPkvxF+8HQ==
-----END PRIVATE KEY-----''');
final ecKey = ECPrivateKey('''-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgevZzL1gdAFr88hb2
OF/2NxApJCzGCEDdfSp6VQO30hyhRANCAAQRWz+jn65BtOMvdyHKcvjBeBSDZH2r
1RTwjmYSi9R/zpBnuQ4EiMnCqfMPWiZqB4QdbAd0E7oH50VpuZ1P087G
-----END PRIVATE KEY-----''');
final secp256kKey = ECPrivateKey('''-----BEGIN EC PRIVATE KEY-----
MHQCAQEEINCRiJnNDnzfo2So2tWY4AIuzeC2ZBp/hmMDcZz3Fh45oAcGBSuBBAAK
oUQDQgAE0aELkvG/Xeo5y6o0WXRAjlediLptGz7Q8zjDmpGFXkKBYZ6IiL7JJ2Tk
cHzd83bmeUeGX33RGTYFPXs5t/VBnw==
-----END EC PRIVATE KEY-----''');
final edKey = EdDSAPrivateKey(
base64Decode(
'nWGxne/9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2DXWpgBgrEKt9VL/' +
'tPJZAc6DuFy89qmIyWvAhpo9wdRGg==',
),
);
class MockRSAAlgorithm extends RSAAlgorithm {
MockRSAAlgorithm(String name) : super(name, Random(42));
}
String sign(JWTKey key, JWTAlgorithm algorithm) {
final jwt = JWT({'foo': 'bar'});
final token = jwt.sign(
key,
algorithm: algorithm,
noIssueAt: true,
);
return token;
}
void main() {
group('Signing a JWT', () {
//------//
// HMAC //
//------//
group('HMAC', () {
test('.sign HS256', () {
final token = sign(hsKey, JWTAlgorithm.HS256);
final expectedToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.NGVtp-VylRDt194QX0dDtpO6npY0je5nJvmF5w9MsS4';
expect(token, equals(expectedToken));
});
test('.sign HS384', () {
final token = sign(hsKey, JWTAlgorithm.HS384);
final expectedToken = 'eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.DGsoLHrTRkgC-57QAcDQOyg1EcgonMG2x_zb1GsPR3hBfGxedHzd82erWkGpq7LZ';
expect(token, equals(expectedToken));
});
test('.sign HS512', () {
final token = sign(hsKey, JWTAlgorithm.HS512);
final expectedToken = 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.yMDFowJXjwLXdUm5wTgBSP9nrc4SPCNlYghqjPZdVSYLE112S8S_xIuA3ISTykaCg1kIs2LED0I0lCRMRdqH4g';
expect(token, equals(expectedToken));
});
});
//-------------------//
// RSASSA-PKCS1-v1_5 //
//-------------------//
group('RSASSA-PKCS1-v1_5', () {
test('.sign RS256', () {
final token = sign(rsaKey, JWTAlgorithm.RS256);
final expectedToken = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.YHSMCF3EegI4GLg46jfD7HBEbqq7qgQ-wOlAnepxxe7Mewtrw3hvfM4bxAi70UqzNdCl3tIqvlATlTyG7VZf9tjb1PG9TGyEaqz87rJktsq0hUbZxKRZgbADHxKjUk_QVuwF39XYv4_ENYVUNDXU5nQJ_d1W2JW-1SzI3cwn_qRqyryyL_x6TOQbtbWdxusJBL-uJmE2XZMqGJah3ZrWICh_ehswwDfZXCifUfHYOnLlzoDuqzeYyoi1y_l83wIBaopF2lbopgjAdZGzrP2kUsDm2RlcGNAlGKGoV3W7rGuosGNsBDHkHYuIFwoPti77bcbticv2nBn1ksGmxvYxiw';
expect(token, equals(expectedToken));
});
test('.sign RS384', () {
final token = sign(rsaKey, JWTAlgorithm.RS384);
final expectedToken = 'eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.JdaVcZhrmwThENssjjFxL8nTovqCmAmDKl81jU1pBpKRShokN_KPasMhxrwgKQQVubQP3a_GV8JMdz_VRikoMm_iFhj8OUXIt74eZhuZXD6CaZrRrHCBWNX0FfT0OnwjtkNiHsza2dne8WZ4nf1M1g9vOZ4JF2cQ7DfwX6SPuV_nhzkuBcYAifjNYUbFUeKQFRVhoXAnrvvBFT2wCa5pa1QrFpsZbPEsOclCAIwLUx7sbA7V8jZWLDXQm0rlsTUEDAG0g8PQArXf8MiKmOFkoxNPMgmgdt0H6Ju1KqYdmgsTJ87TadLBQ7PVCTm6GfCtSSZBMHfWmvectVWYGRjiHQ';
expect(token, equals(expectedToken));
});
test('.sign RS512', () {
final token = sign(rsaKey, JWTAlgorithm.RS512);
final expectedToken = 'eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.pIqXt4HVhvjNS-6mPEz9mR7pr8V-w1u-x1jMN7Tie-eqLUEcYA6I-3SeSHfCfEDhM4ssp7wpPZ4CoFJV3m_hQR-sugBbZ6CvSNlGT7U2DXBvmTyHSU-eckM7y4fxWGsa8-PIm1MZHKvIUCD5vYcXKgt0mz_57OOXikcT-sgbUDYB0HU0Gii_klO7QNUV7Wykyu1HK6wg9nQJXJ8rzFhPMGR3Nqo-D9UIhayl714Tm-ZqdAWRD1YMsK6zJz5ajQu1_NZ11j4ACAVF2BuzSSfT2Cuw1zMcE_7xce1nSt1sHho__SBobsUPvO_Izp12ppz--zcAC6dPS1_4W8GxuiodEQ';
expect(token, equals(expectedToken));
});
});
//-------//
// ECDSA //
//-------//
group('ECDSA', () {
test('.sign ES256', () {
final token = sign(ecKey, JWTAlgorithm.ES256);
final expectedToken = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.mUJVRsRm7VXpxNHfVWdU43BJtuV8MKDcNMSr9agp_-M4FsamUibn04y8PgNzQizdw9BWTwkjQcpm1Go1LHPMyg';
expect(token, equals(expectedToken));
});
test('.sign ES256K', () {
final token = sign(secp256kKey, JWTAlgorithm.ES256K);
final expectedToken = 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ' +
'.eyJmb28iOiJiYXIifQ' +
'.ZuwDjYNGu7PLS_knFAASC_J4t4tcmv6PHV7Pm_QJImqoCs0K96WFVCDchW4gy6AFE4ANAGTOGgfPcQFulNDAFQ';
expect(token, equals(expectedToken));
});
test('.sign ES384', () {
final token = sign(ecKey, JWTAlgorithm.ES384);
final expectedToken = 'eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.c0CieEtA25lXmmX3VLeBy0ir8Gv41QGHiwwfHCfzied3v3Ur3DOP0PVjvBkSXQy82iYAWBfjDBj44ZBpwqE4DA';
expect(token, equals(expectedToken));
});
test('.sign ES512', () {
final token = sign(ecKey, JWTAlgorithm.ES512);
final expectedToken = 'eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.WwnWqtru-JEM1fvkYFEgm5946iSk1esdZuBNbQAbfdg6FURD-3J6HEEoLlIQQ8oh8LfdyDR8KSAVt83WLHUFqg';
expect(token, equals(expectedToken));
});
});
//------------//
// RSASSA-PSS //
//------------//
group('RSASSA-PSS', () {
test('.sign PS256', () {
final token = sign(rsaKey, MockRSAAlgorithm('PS256'));
final expectedToken = 'eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.JYyEew2G-Bb6p8L7BCfZ79o-42HlMynq7zS_Rc_3q3M2CjvaEY1F_ratOPlveR8wqTAN6swxVfx48ZdRnV282EckX9JOel_MjQH87Iutauj-v6D90xLW2IZt-T2gOkqIo2AQ2i1PeM47jCwbawwuYyy_G433-Rw3tP2j6neNV9tTIAjQicaDVxeqKcvF3l1YjsSLqrLGB4rHLZcCv47CURpO9ZB7WgmOvP_vqKJB_Pcoo6iMI0EIW6REYFIXF1Wxs8Xg9Schyb6p1WjRD4fGPDW9m_uqoaOw9TfAh4GKeWYXE5sw1EZH2l5grStK3_dA0bLeLCOKZkZJZm-TD_cyRw';
expect(token, equals(expectedToken));
});
test('.sign PS384', () {
final token = sign(rsaKey, MockRSAAlgorithm('PS384'));
final expectedToken = 'eyJhbGciOiJQUzM4NCIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.KVuzcv9rBYCcQMPPjis1sAuYy4jSrustwT-gRqx1P0P1Q43ku-f3tXcFluYUJO6r6gVzV_OmsffxSGgk7QEc8SFqoAWO25QaGYAKqjqeKUL-57d8NQSFLSEdJhrNZ1z6jQoTmkVxgKi5EqDV0DbAt4d6yBd8I2QFLS9G1QNa3XtziwJezrVS-Z6ccIesoZwzczebiHnEmG8DPDcv5Y8Jb_nnmY2w8AQ_wVU1AkiUkTEZ1lDzYB_YUxCzUzSmqrLHIAHsUoV5lt3-hzOJl9Mp5f4ik0QtqQ76NaUZoXrVnTaMpES1bHwpGZcJQEu3igzm6RjI8-kkfcpUsG4Nwsx4TQ';
expect(token, equals(expectedToken));
});
test('.sign PS512', () {
final token = sign(rsaKey, MockRSAAlgorithm('PS512'));
final expectedToken = 'eyJhbGciOiJQUzUxMiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.Pfgxx9l4863v2pEs4uZgR6WJ9HHu0hPO9I6JkiSSJ8idsl9hpW6iuHmVvRskvbqVxKcZi1EQZ_9p-JDRB5JZCVn73BRencZiV_MDc0pDwOqd8Y7RmYiG_V_yfE_djJIpk9vEcpSJuC3Ow6uesNthcyG1CRU41f_qbUaNdg4AYucpvVxEKVzwss94Iq4bqIFy56pKl6HfwZZx1ShlefrbIPVpZgE4TPGwoR2GxMc0zuMAea3skHhRC02TZNiFZJ6zqBUolNrWxIoXNFyeLnjZgi6IHJ0jClym54HT8r_hOnf6j5J8M0j7xUmUZD7WDSdLw0pJU8VsCBtgec5Bk9HQiQ';
expect(token, equals(expectedToken));
});
});
//-------//
// EdDSA //
//-------//
group('EdDSA', () {
test('.sign EdDSA', () {
final token = sign(edKey, JWTAlgorithm.EdDSA);
final expectedToken = 'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.8tRIxs_o_isQItc2FtzA34Ah-EEvBj7Fw6lKh2tD53IOx5CinBM36yIGo2TDHNmm-ElATCdnMisUKt_UJ5pTAg';
expect(token, equals(expectedToken));
});
});
});
}

200
test/verify_test.dart Normal file
View File

@ -0,0 +1,200 @@
import 'dart:convert';
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'package:test/test.dart';
final hsKey = SecretKey('secret passphrase');
final rsaKey = RSAPublicKey('''-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1SU1LfVLPHCozMxH2Mo
4lgOEePzNm0tRgeLezV6ffAt0gunVTLw7onLRnrq0/IzW7yWR7QkrmBL7jTKEn5u
+qKhbwKfBstIs+bMY2Zkp18gnTxKLxoS2tFczGkPLPgizskuemMghRniWaoLcyeh
kd3qqGElvW/VDL5AaWTg0nLVkjRo9z+40RQzuVaE8AkAFmxZzow3x+VJYKdjykkJ
0iT9wCS0DRTXu269V264Vf/3jvredZiKRkgwlL9xNAwxXFg0x/XFw005UWVRIkdg
cKWTjpBP2dPwVZ4WWC+9aGVd+Gyn1o0CLelf4rEjGoXbAAEgAqeGUxrcIlbjXfbc
mwIDAQAB
-----END PUBLIC KEY-----''');
final ecKey = ECPublicKey('''-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEVs/o5+uQbTjL3chynL4wXgUg2R9
q9UU8I5mEovUf86QZ7kOBIjJwqnzD1omageEHWwHdBO6B+dFabmdT9POxg==
-----END PUBLIC KEY-----''');
final secp256kKey = ECPublicKey('''-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0aELkvG/Xeo5y6o0WXRAjlediLptGz7Q
8zjDmpGFXkKBYZ6IiL7JJ2TkcHzd83bmeUeGX33RGTYFPXs5t/VBnw==
-----END PUBLIC KEY-----''');
final edKey = EdDSAPublicKey(
base64Decode('11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo='),
);
void main() {
group('Verify a JWT', () {
//------//
// HMAC //
//------//
group('HMAC', () {
test('.verify HS256', () {
final token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.NGVtp-VylRDt194QX0dDtpO6npY0je5nJvmF5w9MsS4';
final jwt = JWT.tryVerify(token, hsKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
test('.verify HS384', () {
final token = 'eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.DGsoLHrTRkgC-57QAcDQOyg1EcgonMG2x_zb1GsPR3hBfGxedHzd82erWkGpq7LZ';
final jwt = JWT.tryVerify(token, hsKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
test('.verify HS512', () {
final token = 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.yMDFowJXjwLXdUm5wTgBSP9nrc4SPCNlYghqjPZdVSYLE112S8S_xIuA3ISTykaCg1kIs2LED0I0lCRMRdqH4g';
final jwt = JWT.tryVerify(token, hsKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
});
//-------------------//
// RSASSA-PKCS1-v1_5 //
//-------------------//
group('RSASSA-PKCS1-v1_5', () {
test('.verify RS256', () {
final token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.YHSMCF3EegI4GLg46jfD7HBEbqq7qgQ-wOlAnepxxe7Mewtrw3hvfM4bxAi70UqzNdCl3tIqvlATlTyG7VZf9tjb1PG9TGyEaqz87rJktsq0hUbZxKRZgbADHxKjUk_QVuwF39XYv4_ENYVUNDXU5nQJ_d1W2JW-1SzI3cwn_qRqyryyL_x6TOQbtbWdxusJBL-uJmE2XZMqGJah3ZrWICh_ehswwDfZXCifUfHYOnLlzoDuqzeYyoi1y_l83wIBaopF2lbopgjAdZGzrP2kUsDm2RlcGNAlGKGoV3W7rGuosGNsBDHkHYuIFwoPti77bcbticv2nBn1ksGmxvYxiw';
final jwt = JWT.tryVerify(token, rsaKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
test('.verify RS384', () {
final token = 'eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.JdaVcZhrmwThENssjjFxL8nTovqCmAmDKl81jU1pBpKRShokN_KPasMhxrwgKQQVubQP3a_GV8JMdz_VRikoMm_iFhj8OUXIt74eZhuZXD6CaZrRrHCBWNX0FfT0OnwjtkNiHsza2dne8WZ4nf1M1g9vOZ4JF2cQ7DfwX6SPuV_nhzkuBcYAifjNYUbFUeKQFRVhoXAnrvvBFT2wCa5pa1QrFpsZbPEsOclCAIwLUx7sbA7V8jZWLDXQm0rlsTUEDAG0g8PQArXf8MiKmOFkoxNPMgmgdt0H6Ju1KqYdmgsTJ87TadLBQ7PVCTm6GfCtSSZBMHfWmvectVWYGRjiHQ';
final jwt = JWT.tryVerify(token, rsaKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
test('.verify RS512', () {
final token = 'eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.pIqXt4HVhvjNS-6mPEz9mR7pr8V-w1u-x1jMN7Tie-eqLUEcYA6I-3SeSHfCfEDhM4ssp7wpPZ4CoFJV3m_hQR-sugBbZ6CvSNlGT7U2DXBvmTyHSU-eckM7y4fxWGsa8-PIm1MZHKvIUCD5vYcXKgt0mz_57OOXikcT-sgbUDYB0HU0Gii_klO7QNUV7Wykyu1HK6wg9nQJXJ8rzFhPMGR3Nqo-D9UIhayl714Tm-ZqdAWRD1YMsK6zJz5ajQu1_NZ11j4ACAVF2BuzSSfT2Cuw1zMcE_7xce1nSt1sHho__SBobsUPvO_Izp12ppz--zcAC6dPS1_4W8GxuiodEQ';
final jwt = JWT.tryVerify(token, rsaKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
});
//-------//
// ECDSA //
//-------//
group('ECDSA', () {
test('.verify ES256', () {
final token = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.mUJVRsRm7VXpxNHfVWdU43BJtuV8MKDcNMSr9agp_-M4FsamUibn04y8PgNzQizdw9BWTwkjQcpm1Go1LHPMyg';
final jwt = JWT.tryVerify(token, ecKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
test('.verify ES256K', () {
final token = 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ' +
'.eyJmb28iOiJiYXIifQ' +
'.ZuwDjYNGu7PLS_knFAASC_J4t4tcmv6PHV7Pm_QJImqoCs0K96WFVCDchW4gy6AFE4ANAGTOGgfPcQFulNDAFQ';
final jwt = JWT.tryVerify(token, secp256kKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
test('.verify ES384', () {
final token = 'eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.c0CieEtA25lXmmX3VLeBy0ir8Gv41QGHiwwfHCfzied3v3Ur3DOP0PVjvBkSXQy82iYAWBfjDBj44ZBpwqE4DA';
final jwt = JWT.tryVerify(token, ecKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
test('.verify ES512', () {
final token = 'eyJhbGciOiJFUzUxMiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.WwnWqtru-JEM1fvkYFEgm5946iSk1esdZuBNbQAbfdg6FURD-3J6HEEoLlIQQ8oh8LfdyDR8KSAVt83WLHUFqg';
final jwt = JWT.tryVerify(token, ecKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
});
//------------//
// RSASSA-PSS //
//------------//
group('RSASSA-PSS', () {
test('.verify PS256', () {
final token = 'eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.JYyEew2G-Bb6p8L7BCfZ79o-42HlMynq7zS_Rc_3q3M2CjvaEY1F_ratOPlveR8wqTAN6swxVfx48ZdRnV282EckX9JOel_MjQH87Iutauj-v6D90xLW2IZt-T2gOkqIo2AQ2i1PeM47jCwbawwuYyy_G433-Rw3tP2j6neNV9tTIAjQicaDVxeqKcvF3l1YjsSLqrLGB4rHLZcCv47CURpO9ZB7WgmOvP_vqKJB_Pcoo6iMI0EIW6REYFIXF1Wxs8Xg9Schyb6p1WjRD4fGPDW9m_uqoaOw9TfAh4GKeWYXE5sw1EZH2l5grStK3_dA0bLeLCOKZkZJZm-TD_cyRw';
final jwt = JWT.tryVerify(token, rsaKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
test('.verify PS384', () {
final token = 'eyJhbGciOiJQUzM4NCIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.KVuzcv9rBYCcQMPPjis1sAuYy4jSrustwT-gRqx1P0P1Q43ku-f3tXcFluYUJO6r6gVzV_OmsffxSGgk7QEc8SFqoAWO25QaGYAKqjqeKUL-57d8NQSFLSEdJhrNZ1z6jQoTmkVxgKi5EqDV0DbAt4d6yBd8I2QFLS9G1QNa3XtziwJezrVS-Z6ccIesoZwzczebiHnEmG8DPDcv5Y8Jb_nnmY2w8AQ_wVU1AkiUkTEZ1lDzYB_YUxCzUzSmqrLHIAHsUoV5lt3-hzOJl9Mp5f4ik0QtqQ76NaUZoXrVnTaMpES1bHwpGZcJQEu3igzm6RjI8-kkfcpUsG4Nwsx4TQ';
final jwt = JWT.tryVerify(token, rsaKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
test('.verify PS512', () {
final token = 'eyJhbGciOiJQUzUxMiIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.Pfgxx9l4863v2pEs4uZgR6WJ9HHu0hPO9I6JkiSSJ8idsl9hpW6iuHmVvRskvbqVxKcZi1EQZ_9p-JDRB5JZCVn73BRencZiV_MDc0pDwOqd8Y7RmYiG_V_yfE_djJIpk9vEcpSJuC3Ow6uesNthcyG1CRU41f_qbUaNdg4AYucpvVxEKVzwss94Iq4bqIFy56pKl6HfwZZx1ShlefrbIPVpZgE4TPGwoR2GxMc0zuMAea3skHhRC02TZNiFZJ6zqBUolNrWxIoXNFyeLnjZgi6IHJ0jClym54HT8r_hOnf6j5J8M0j7xUmUZD7WDSdLw0pJU8VsCBtgec5Bk9HQiQ';
final jwt = JWT.tryVerify(token, rsaKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
});
//-------//
// EdDSA //
//-------//
group('EdDSA', () {
test('.verify EdDSA', () {
final token = 'eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9' +
'.eyJmb28iOiJiYXIifQ' +
'.8tRIxs_o_isQItc2FtzA34Ah-EEvBj7Fw6lKh2tD53IOx5CinBM36yIGo2TDHNmm-ElATCdnMisUKt_UJ5pTAg';
final jwt = JWT.tryVerify(token, edKey);
expect(jwt, isNotNull);
expect(jwt?.payload, equals({'foo': 'bar'}));
});
});
});
}