| // See file LICENSE for more information. |
| |
| library impl.padding.pkcs7; |
| |
| import 'dart:typed_data'; |
| |
| import 'package:pointycastle/api.dart'; |
| import 'package:pointycastle/src/impl/base_padding.dart'; |
| import 'package:pointycastle/src/registry/registry.dart'; |
| import 'package:pointycastle/src/ufixnum.dart'; |
| |
| /// A [Padding] that adds PKCS7/PKCS5 padding to a block. |
| class PKCS7Padding extends BasePadding { |
| static final FactoryConfig factoryConfig = |
| StaticFactoryConfig(Padding, 'PKCS7', () => PKCS7Padding()); |
| |
| @override |
| String get algorithmName => 'PKCS7'; |
| |
| @override |
| void init([CipherParameters? params]) { |
| // nothing to do. |
| } |
| |
| @override |
| int addPadding(Uint8List data, int offset) { |
| var code = data.length - offset; |
| |
| while (offset < data.length) { |
| data[offset] = code; |
| offset++; |
| } |
| |
| return code; |
| } |
| |
| @override |
| int padCount(Uint8List data) { |
| var count = clip8(data[data.length - 1]); |
| |
| if (count > data.length || count == 0) { |
| throw ArgumentError('Invalid or corrupted pad block'); |
| } |
| |
| for (var i = 1; i <= count; i++) { |
| if (data[data.length - i] != count) { |
| throw ArgumentError('Invalid or corrupted pad block'); |
| } |
| } |
| |
| return count; |
| } |
| } |