Пример #1
0
void testHash256()
{
    INT32 i;
    UINT32 hash[SHA256_HASH_SIZE] = { 0 };
    UINT32 data[128] = { 0 };

    for (i = 0; i < sizeof(data)/sizeof(data[0]); i++)
    {
        data[i] = i;
    }

    if(OK != SHA256Hash((UINT32)data, sizeof(data), hash))
    {
        print_info("\r\nsha256 err!");
    }
    else
    {
        for (i = 0; i < SHA256_HASH_SIZE; i++)
        {
            print_info_with_u32("\r\n 1: ", hash[i]);
        }
    }

    if(OK != SHA256Hash((UINT32)data, sizeof(data), hash))
    {
        print_info("\r\nsha256 err!");
    }
    else
    {
        for (i = 0; i < SHA256_HASH_SIZE; i++)
        {
            print_info_with_u32("\r\n 2: ", hash[i]);
        }
    }
}
Пример #2
0
/*****************************************************************************
* 函 数 名  : idioIdentify
*
* 功能描述  : 通过校验输入数据的hash值是 否
*             与其签名用RSA解密后的值一样
*             来校验输入数据的合法性 *
*
* 输入参数  : dataAddr--输入数据的地址
*             dataLen--输入数据的长度
*             pubKey--公钥
*             pIdio--输入数据签名的指针
* 输出参数  :
*
* 返 回 值  : OK/ !OK
*
* 其它说明  :
*
*****************************************************************************/
int idioIdentify(UINT32 dataAddr, UINT32 dataLen, KEY_STRUCT *pubKey, UINT32* pIdio)
{
    UINT32 sha256Hash[SHA256_HASH_SIZE];      /*用来存放SHA256值的临时buffer*/
    UINT32 rsa[IDIO_LEN/4];                   /*用来存放RSA加密值的临时buffer*/
    int i;

    memset(sha256Hash, 0, SHA256_HASH_SIZE*4);
    memset(rsa, 0, IDIO_LEN);

    /*通过SHA256计算输入数据(data)的hash值*/
    if(OK != SHA256Hash(dataAddr, dataLen, sha256Hash))
    {
        print_info("\r\nhash calc err!" );
        return !OK;
    }

    /*使用公钥(pubKey),通过RSA解密出输入签名(dataIdioAddr)的明文*/
    if(OK != RSA(pubKey, pIdio, rsa))
    {
        print_info("\r\nrsa calc err!" );
        return !OK;
    }

    /*比较二者是否相同*/
    for(i = 0; i < SHA256_HASH_SIZE; i++)
    {
        if( sha256Hash[i] != rsa[i] )
        {
            return !OK;
        }
    }

    return OK;
}
Пример #3
0
void Base58::fourbyte_hash256 (void* out, void const* in, std::size_t bytes)
{
    unsigned char const* const p (
        static_cast <unsigned char const*>(in));
    uint256 hash (SHA256Hash (p, p + bytes));
    memcpy (out, hash.begin(), 4);
}
Пример #4
0
bool Base58::decodeWithCheck (const char* psz, Blob& vchRet, Alphabet const& alphabet)
{
    if (!decode (psz, vchRet, alphabet))
        return false;

    if (vchRet.size () < 4)
    {
        vchRet.clear ();
        return false;
    }

    uint256 hash = SHA256Hash (vchRet.begin (), vchRet.end () - 4);

    if (memcmp (&hash, &vchRet.end ()[-4], 4) != 0)
    {
        vchRet.clear ();
        return false;
    }

    vchRet.resize (vchRet.size () - 4);
    return true;
}
Пример #5
0
/*****************************************************************************
* 函 数 名  : secCheck
*
* 功能描述  : 安全校验总入口
*
* 输入参数  : ulImageAddr--映像地址,必须字对齐
*                  eImageTye--镜像类型
* 输出参数  :
*
* 返 回 值  : SEC_IMAGE_LEN_ERROR   镜像长度过长
*             SEC_EFUSE_READ_ERROR   Efuse读取错误
*             SEC_EFUSE_NOT_WRITE    Efuse未烧写
*             SEC_SHA_CALC_ERROR     SHA计算错误
*             SEC_ROOT_CA_ERROR      根CA校验错误
*             SEC_OEMCA_ERROR        OEM CA校验错误
*             SEC_IMAGE_ERROR        镜像签名校验错误
*
* 其它说明  :
*
*****************************************************************************/
int secCheck(UINT32 ulImageAddr, IMAGE_TYPE_E eImageTye)
{
    int i;
    UINT32 blLen = 0;
    KEY_STRUCT *pstKeyRoot;
    KEY_STRUCT *pstKeyBl;                       /*映像的公钥*/
    UINT32 sha256HashCa[SHA256_HASH_SIZE];      /*用来存放SHA256值的临时buffer*/
    UINT32 md5HashEfuse[MD5_HASH_SIZE];      /*用来存放SHA256值的MD5值的临时buffer*/
    UINT32 md5HashCa[MD5_HASH_SIZE];            /*用来存放SHA256值的MD5值的临时buffer*/

    UINT32 imageIdioAddr;                   /*镜像的签名的地址*/
    UINT32 imageCaAddr;                     /*映像的CA的地址*/
    UINT32 imageCaIdioAddr;                 /*映像的CA签名的地址*/

    MD5_CTX md5_contex;

    volatile tOcrShareData *pShareData = (tOcrShareData*)M3_SRAM_SHARE_DATA_ADDR;

     /*获取bootload.bin文件的长度(字节数)*/
     if(IMAGE_TYPE_DOWNLOAD != eImageTye)
     {
        blLen = *(volatile UINT32 *)(ulImageAddr+BL_LEN_INDEX);
     }
     else
     {
        blLen = *(volatile UINT32 *)(ulImageAddr+DOWNLOAD_BL_LEN_INDEX);
     }

    /* 判断长度是否合法:不为零/字对齐/不翻转/不过大 */
    if((0 == blLen)
        || (blLen % 4)
        || (blLen + IDIO_LEN + OEM_CA_LEN + IDIO_LEN < blLen)
        || ((IMAGE_TYPE_DOWNLOAD != eImageTye) /* 若为USB自举版本,无需校验版本长度 */
            && (blLen + IDIO_LEN + OEM_CA_LEN + IDIO_LEN > BOOTLOAD_SIZE_MAX)))
    {
    	print_info_with_u32("\r\nSec image len err: 0x", blLen);
        return SEC_IMAGE_LEN_ERROR;
    }

    /* 获取镜像签名的位置 */
    imageIdioAddr = ulImageAddr + blLen;

    /* 获取OEM CA的位置 */
    imageCaAddr = imageIdioAddr + IDIO_LEN;

    /* 获取OEM CA签名的位置 */
    imageCaIdioAddr = imageCaAddr + OEM_CA_LEN;

    /* 根CA已经在RAM初始化程序中校验通过,加载程序不需再校验根CA */
    if(IMAGE_TYPE_DOWNLOAD != eImageTye)
    {
        /* 读取Efuse中的根CA的Hash值 */
        if(OK != efuseRead(EFUSE_GRP_ROOT_CA, md5HashEfuse, MD5_HASH_SIZE))
        {
            print_info("\r\nEfuse read err!");
            return SEC_EFUSE_READ_ERROR;
        }

        /* 检查Efuse是否已烧写 */
        if(EFUSE_NOT_WRITED == efuseWriteCheck(md5HashEfuse, MD5_HASH_SIZE))
        {
            pShareData->bRootCaInited = FALSE;
            pShareData->bSecEn = FALSE;         /* Efuse未烧写,无法获得根CA不使能安全校验 */
            print_info("\r\nEfuse not write, sec will be disabled!" );
            return SEC_EFUSE_NOT_WRITE;
        }

        pstKeyRoot = (KEY_STRUCT *)(ulImageAddr + ROOT_CA_INDEX);
        /* 计算根公钥的Hash值 */
        if(OK != SHA256Hash((UINT32)pstKeyRoot, ROOT_CA_LEN, sha256HashCa))
        {
            print_info("\r\nsha256 err!");
            return SEC_SHA_CALC_ERROR;
        }

        MD5Init(&md5_contex);
        MD5Update(&md5_contex, (unsigned char *)sha256HashCa, sizeof(sha256HashCa));
        MD5Final(&md5_contex, (unsigned char*)md5HashCa);

        /* 比较根公钥的Hash值 */
        for(i=0; i<MD5_HASH_SIZE; i++)
        {
            if(md5HashEfuse[i] != md5HashCa[i])
            {
                print_info("\r\nRoot CA check err!");
                return SEC_ROOT_CA_ERROR;
            }
        }

        /* 保存根公钥,共享给BootLoader */
        pShareData->pRootKey = pstKeyRoot;
        pShareData->bRootCaInited = TRUE;

    }
    else
    {
        /* 防止未运行RAM初始化程序就直接运行USB加载程序 */
        if(!pShareData->bRootCaInited)
        {
            print_info("root ca not inited!");
            return SEC_ROOT_CA_ERROR;
        }
    }

    /*鉴权映像证书*/
    if(OK != idioIdentify(imageCaAddr, OEM_CA_LEN, pShareData->pRootKey, (UINT32*)imageCaIdioAddr))
    {
        print_info("\r\nOEM CA check err!" );
        return SEC_OEMCA_ERROR;
    }

    /*鉴权bootload映像*/
    pstKeyBl = (KEY_STRUCT *)imageCaAddr;

    if(OK != idioIdentify(ulImageAddr, blLen, pstKeyBl, (UINT32*)imageIdioAddr))
    {
        print_info("\r\nimage check err!" );
        return SEC_IMAGE_ERROR;
    }

    return SEC_SUCCESS;
}
Пример #6
0
std::string sha256(const std::string &string)
{
    return SHA256Hash(string.c_str(), string.length());
}
Пример #7
0
std::string sha256(const std::string &string)
{
    return SHA256Hash(string.c_str(), static_cast<int>(string.length()));
}
Пример #8
0
void MainWindow::TextChanged(QString text)
{
    if(text.isEmpty())
    {
        this->ui->lineEdit_2->setText("Enter some text");
        return;
    }

    QString str;

    switch(this->comboselected)
    {
        case 0: // MD5
            this->ui->lineEdit_2->setText(QString().fromStdString(md5(text.toStdString())));
            break;
        case 1: // MD4
            //this->ui->lineEdit_2->setText();
            break;
        case 2: // SHA-1
            this->ui->lineEdit_2->setText(SHA1Hash(text));
            break;
        case 3: // SHA-2
            //this->ui->lineEdit_2->setText();
            break;
        case 4: // SHA-3
            //this->ui->lineEdit_2->setText();
            break;
        case 5: // SHA-256
            this->ui->lineEdit_2->setText(SHA256Hash(text));
            break;
        case 6: // SHA-384
            //this->ui->lineEdit_2->setText();
            break;
        case 7: // SHA-512
            //this->ui->lineEdit_2->setText();
            break;
        case 8: // RIPEMD-128
            //this->ui->lineEdit_2->setText();
            break;
        case 9: // RIPEMD-160
            //this->ui->lineEdit_2->setText();
            break;
        case 10: // Whirlpool
            //this->ui->lineEdit_2->setText();
            break;
        case 11: // GOST
            //this->ui->lineEdit_2->setText();
            break;
        case 12: // Tiger
            //this->ui->lineEdit_2->setText();
            break;
        case 13: // Skein
            //this->ui->lineEdit_2->setText();
            break;
        case 14: // Blake
            if(BlakeHash(str, text))
                this->ui->lineEdit_2->setText(str);
            break;
        case 15: // NONE
            this->ui->lineEdit_2->setText(text);
            break;
        default:
            break;
    }
}