Files
hcs/Hcs.Client/GostCryptography/Asn1/Ber/Asn1RunTime.cs
HOME-LAPTOP\kshkulev 33ab055b43 Add project
Basic formatting applied. Unnecessary comments have been removed. Suspicious code is covered by TODO.
2025-08-12 11:21:10 +09:00

152 lines
4.3 KiB
C#

using GostCryptography.Properties;
namespace GostCryptography.Asn1.Ber
{
public static class Asn1RunTime
{
public const int LicBer = 1;
public const int LicPer = 2;
public const int LicXer = 4;
public const long Bit0Mask = -9223372036854775808L;
public static long DecodeIntValue(Asn1DecodeBuffer buffer, int length, bool signExtend)
{
var num = 0L;
if (length > 8)
{
throw ExceptionUtility.CryptographicException(Resources.Asn1IntegerValueIsTooLarge);
}
for (var i = 0; i < length; i++)
{
var num2 = buffer.ReadByte();
if (num2 < 0)
{
throw ExceptionUtility.CryptographicException(Resources.Asn1EndOfBufferException, buffer.ByteCount);
}
if ((i == 0) && signExtend)
{
num = (num2 > 0x7f) ? -1 : 0;
}
num = (num * 0x100L) + num2;
}
return num;
}
public static int GetIdentBytesCount(long ident)
{
if (ident < 0x80L)
{
return 1;
}
if (ident < 0x4000L)
{
return 2;
}
if (ident < 0x200000L)
{
return 3;
}
if (ident < 0x10000000L)
{
return 4;
}
if (ident < 0x800000000L)
{
return 5;
}
if (ident < 0x40000000000L)
{
return 6;
}
if (ident < 0x2000000000000L)
{
return 7;
}
if (ident < 0x100000000000000L)
{
return 8;
}
return 9;
}
public static int GetLongBitCount(long ivalue)
{
var num = ivalue & Bit0Mask;
var num2 = 0;
if (ivalue != 0L)
{
while ((ivalue & Bit0Mask) == num)
{
num2++;
ivalue = ivalue << 1;
}
if (num == Bit0Mask)
{
num2--;
}
return (0x40 - num2);
}
return 0;
}
public static int GetLongBytesCount(long value)
{
var num = 0x7f80000000000000L;
var num2 = 8;
if (value < 0L)
{
value ^= -1L;
}
while ((num2 > 1) && ((value & num) == 0L))
{
num = num >> 8;
num2--;
}
return num2;
}
public static int GetUlongBytesCount(long value)
{
var number = -72057594037927936L;
var num2 = 8;
while ((num2 > 1) && ((value & number) == 0L))
{
number = Asn1Util.UrShift(number, 8);
num2--;
}
return num2;
}
public static int IntTrailingZerosCnt(int w)
{
return (0x20 -
(((w & 0xffff) != 0)
? (((w & 0xff) != 0) ? ((((w & 15) != 0) ? (((w & 3) != 0) ? (((w & 1) != 0) ? 8 : 7) : (((w & 4) != 0) ? 6 : 5)) : (((w & 0x30) != 0) ? (((w & 0x10) != 0) ? 4 : 3) : (((w & 0x40) != 0) ? 2 : (((w & 0x80) != 0) ? 1 : 0)))) + 0x18) : (((((w = Asn1Util.UrShift(w, 8)) & 15) != 0) ? (((w & 3) != 0) ? (((w & 1) != 0) ? 8 : 7) : (((w & 4) != 0) ? 6 : 5)) : (((w & 0x30) != 0) ? (((w & 0x10) != 0) ? 4 : 3) : (((w & 0x40) != 0) ? 2 : (((w & 0x80) != 0) ? 1 : 0)))) + 0x10))
: ((((w = Asn1Util.UrShift(w, 0x10)) & 0xff) != 0) ? ((((w & 15) != 0) ? (((w & 3) != 0) ? (((w & 1) != 0) ? 8 : 7) : (((w & 4) != 0) ? 6 : 5)) : (((w & 0x30) != 0) ? (((w & 0x10) != 0) ? 4 : 3) : (((w & 0x40) != 0) ? 2 : (((w & 0x80) != 0) ? 1 : 0)))) + 8) : ((((w = Asn1Util.UrShift(w, 8)) & 15) != 0) ? (((w & 3) != 0) ? (((w & 1) != 0) ? 8 : 7) : (((w & 4) != 0) ? 6 : 5)) : (((w & 0x30) != 0) ? (((w & 0x10) != 0) ? 4 : 3) : (((w & 0x40) != 0) ? 2 : (((w & 0x80) != 0) ? 1 : 0)))))));
}
}
}