⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asn.cpp

📁 各种加密算法的源代码
💻 CPP
字号:
#include "asn.h"
#include "misc.h"
#include <assert.h>

unsigned int DERLengthEncode(unsigned int length, byte *output)
{
    unsigned int i=0;
    if (length <= 0x7f)
    {
        output[i++] = byte(length);
    }
    else
    {
        output[i++] = byte(BytePrecision(length) | 0x80);
        for (int j=BytePrecision(length); j; --j)
        {
            output[i++] = byte (length >> (j-1)*8);
        }
    }
    return i;
}

unsigned int DERLengthEncode(unsigned int length, BufferedTransformation &bt)
{
    byte buf[10];   // should be more than enough
    unsigned int i = DERLengthEncode(length, buf);
    bt.Put(buf, i);
    return i;
}

boolean BERLengthDecode(BufferedTransformation &bt, unsigned int &length)
{
    byte b;

    if (!bt.Get(b))
        BERDecodeError();

    if (!(b & 0x80))
        length = b;
    else
    {
        unsigned int lengthBytes = b & 0x7f;
        if (bt.MaxRetrieveable() < lengthBytes)
            BERDecodeError();

        bt.Get(b);
        while (!b && lengthBytes>1)
        {
            bt.Get(b);
            lengthBytes--;
        }

        switch (lengthBytes)
        {
        case 0:
            return FALSE;   // indefinite length
        case 1:
            length = b;
            break;
        case 2:
            length = b << 8;
            length |= (bt.Get(b), b);
            break;
        default:
            BERDecodeError();
        }
    }
    return TRUE;
}

BERSequenceDecoder::BERSequenceDecoder(BufferedTransformation &inQueue)
    : inQueue(inQueue)
{
    byte b;
    if (!inQueue.Get(b) || b != (SEQUENCE | CONSTRUCTED))
        BERDecodeError();

    definiteLength = BERLengthDecode(inQueue, length);
}

BERSequenceDecoder::~BERSequenceDecoder()
{
    if (!definiteLength)
    {   // remove end-of-content octects
        word16 i;
        if (!inQueue.GetShort(i) || (i!=0))
            BERDecodeError();
    }
}

DERSequenceEncoder::DERSequenceEncoder(BufferedTransformation &outQueue)
    : outQueue(outQueue)
{
}

DERSequenceEncoder::~DERSequenceEncoder()
{
    unsigned int length = (unsigned int)CurrentSize();
    outQueue.Put(SEQUENCE | CONSTRUCTED);
    DERLengthEncode(length, outQueue);
    TransferTo(outQueue);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -