94 lines
3.1 KiB
Dart
94 lines
3.1 KiB
Dart
import 'dart:convert';
|
|
import 'dart:typed_data';
|
|
|
|
import 'package:pointycastle/asn1/asn1_encoding_rule.dart';
|
|
import 'package:pointycastle/asn1/asn1_object.dart';
|
|
import 'package:pointycastle/asn1/asn1_tags.dart';
|
|
import 'package:pointycastle/asn1/unsupported_asn1_encoding_rule_exception.dart';
|
|
|
|
///
|
|
/// An ASN1 Utc Time object
|
|
///
|
|
/// **Note**: It is not recommended to use the UTC Time in the far future because this will not work anymore after the year 2075,
|
|
/// due to the fact that the UTC Time only uses 2 digits to represent the year.!
|
|
///
|
|
/// Use the **GeneralizedTime** instead!
|
|
///
|
|
class ASN1UtcTime extends ASN1Object {
|
|
///
|
|
/// The decoded DateTime value
|
|
///
|
|
DateTime? time;
|
|
|
|
///
|
|
/// Creates an [ASN1UtcTime] entity with the given [time].
|
|
///
|
|
ASN1UtcTime(this.time, {int tag = ASN1Tags.UTC_TIME}) : super(tag: tag);
|
|
|
|
///
|
|
/// Creates an [ASN1UtcTime] entity from the given [encodedBytes].
|
|
///
|
|
ASN1UtcTime.fromBytes(Uint8List super.encodedBytes) : super.fromBytes() {
|
|
var stringValue = ascii.decode(valueBytes!);
|
|
var formatedStringValue = _format(stringValue);
|
|
time = DateTime.parse(formatedStringValue);
|
|
}
|
|
|
|
///
|
|
/// Encodes this ASN1Object depending on the given [encodingRule]
|
|
///
|
|
/// If no [ASN1EncodingRule] is given, ENCODING_DER will be used.
|
|
///
|
|
/// Supported encoding rules are :
|
|
/// * [ASN1EncodingRule.ENCODING_DER]
|
|
///
|
|
/// Throws an [UnsupportedAsn1EncodingRuleException] if the given [encodingRule] is not supported.
|
|
///
|
|
@override
|
|
Uint8List encode(
|
|
{ASN1EncodingRule encodingRule = ASN1EncodingRule.ENCODING_DER}) {
|
|
if (encodingRule != ASN1EncodingRule.ENCODING_DER) {
|
|
throw UnsupportedAsn1EncodingRuleException(encodingRule);
|
|
}
|
|
var utc = time!.toUtc();
|
|
var year = utc.year.toString().substring(2).padLeft(2, '0');
|
|
var month = utc.month.toString().padLeft(2, '0');
|
|
var day = utc.day.toString().padLeft(2, '0');
|
|
var hour = utc.hour.toString().padLeft(2, '0');
|
|
var minute = utc.minute.toString().padLeft(2, '0');
|
|
var second = utc.second.toString().padLeft(2, '0');
|
|
// Encode string to YYMMDDhhmm[ss]Z
|
|
var utcString = '$year$month$day$hour$minute${second}Z';
|
|
valueBytes = ascii.encode(utcString);
|
|
valueByteLength = valueBytes!.length;
|
|
return super.encode();
|
|
}
|
|
|
|
///
|
|
/// Formats the given [stringValue].
|
|
///
|
|
/// This needs to be done, due to the fact that the UTC Time only uses 2 digits to represent the year.
|
|
/// To use the DateTime.parse() method we have to add the century.
|
|
///
|
|
/// **Note**: It is not recommended to use the UTC Time in the future because this will not work anymore after the year 2075! Use the GeneralizedTime instead.
|
|
///
|
|
String _format(String stringValue) {
|
|
var y2 = int.parse(stringValue.substring(0, 2));
|
|
if (y2 > 75) {
|
|
stringValue = '19$stringValue';
|
|
} else {
|
|
stringValue = '20$stringValue';
|
|
}
|
|
return '${stringValue.substring(0, 8)}T${stringValue.substring(8)}';
|
|
}
|
|
|
|
@override
|
|
String dump({int spaces = 0}) {
|
|
var sb = StringBuffer();
|
|
for (var i = 0; i < spaces; i++) {
|
|
sb.write(' ');
|
|
}
|
|
sb.write('UTCTIME ${time!.toIso8601String()}');
|
|
return sb.toString();
|
|
}
|
|
}
|