import 'dart:convert'; import 'package:crypto/crypto.dart'; import 'package:jsonwebtoken/jsonwebtoken.dart'; abstract class JWTAlgorithm { static const HS256 = HS256Algorithm(); static JWTAlgorithm fromName(String name) { switch (name) { case 'HS256': return JWTAlgorithm.HS256; default: throw JWTInvalidError('unknown algorithm'); } } const JWTAlgorithm(); String get name; List sign(String key, List body); bool verify(String key, List body, List signature); } class HS256Algorithm extends JWTAlgorithm { const HS256Algorithm(); @override String get name => 'HS256'; @override List sign(String key, List body) { final hmac = Hmac(sha256, utf8.encode(key)); return hmac.convert(body).bytes; } @override bool verify(String key, List body, List signature) { final actual = sign(key, body); if (actual.length != signature.length) return false; for (var i = 0; i < actual.length; i++) { if (actual[i] != signature[i]) return false; } return true; } }