twonly-app-dependencies/pointycastle/lib/asn1/primitives/asn1_integer.dart
2025-12-07 16:10:41 +01:00

72 lines
2.1 KiB
Dart

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';
import 'package:pointycastle/src/utils.dart';
class ASN1Integer extends ASN1Object {
///
/// The integer value
///
BigInt? integer;
///
/// Create an [ASN1Integer] entity with the given BigInt [integer].
///
ASN1Integer(this.integer, {int tag = ASN1Tags.INTEGER}) : super(tag: tag);
///
/// Create an [ASN1Integer] entity with the given int [i].
///
ASN1Integer.fromtInt(int i, {int tag = ASN1Tags.INTEGER}) : super(tag: tag) {
integer = BigInt.from(i);
}
///
/// Creates an [ASN1Integer] entity from the given [encodedBytes].
///
ASN1Integer.fromBytes(Uint8List super.encodedBytes) : super.fromBytes() {
integer = decodeBigInt(valueBytes!);
}
///
/// 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);
}
if (integer!.bitLength == 0) {
if (integer == BigInt.from(-1)) {
valueBytes = Uint8List.fromList([0xff]);
} else {
valueBytes = Uint8List.fromList([0]);
}
} else {
valueBytes = encodeBigInt(integer);
}
valueByteLength = valueBytes!.length;
return super.encode();
}
@override
String dump({int spaces = 0}) {
var sb = StringBuffer();
for (var i = 0; i < spaces; i++) {
sb.write(' ');
}
sb.write('INTEGER ${integer.toString().toUpperCase()}');
return sb.toString();
}
}