Ed25519 Signature verification in HSE

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

Ed25519 Signature verification in HSE

1,081件の閲覧回数
cij45
Contributor II

Hello,

I am currently using the S32K312.

I imported a Ed25519 public key in the HSE and am attempting to verify a signature that was generated externally. However, the verification consistently returns the error code 0x55A5A164UL.

Could you please let me know if there is any issue with the parameters I am using for the Ed25519 verification service?

* If possible, I would also appreciate it if you could share a demo code or reference example for performing Ed25519 signature verification using the HSE on S32K312.

Thank you for your support!

 

const uint8_t eccPubKey[32] = {Ed25519 public key};

ImportEccKeyReq(NVM_ECC_SECUREBOOT_HANDLE, HSE_KEY_TYPE_ECC_PUB, HSE_KF_USAGE_VERIFY | HSE_KF_USAGE_AUTHORIZATION,					   				HSE_EC_25519_ED25519, 256, (HOST_ADDR)eccPubKey, NULL);

uint8_t demo_plain[16]= {input value not hashed };
uint8_t rsignature[32]= {First 32 signature};
uint8_t ssignature[32]= {Last 32 signature};
uint32_t demo_sigsize[1] = {32};
	 
EddsaVerify(NVM_ECC_SECUREBOOT_HANDLE, FALSE, 16, (uint8_t*)demo_plain, FALSE, 0, 0, demo_sigsize, rsignature, demo_sigsize, ssignature);

 

hseSrvResponse_t EddsaVerify(hseKeyHandle_t keyHandle, bool_t bHashEddsa,
                             uint32_t inputLength, const uint8_t* pInput, bool_t bInputIsHashed,
                             uint8_t userContextLength, const uint8_t* pUserContext,
                             const uint32_t* pRLen, const uint8_t* pR,
                             const uint32_t* pSLen, const uint8_t* pS)
{
    hseSignScheme_t signScheme;

    signScheme.signSch                 = HSE_SIGN_EDDSA;
    signScheme.sch.eddsa.bHashEddsa    = bHashEddsa;
    signScheme.sch.eddsa.contextLength = userContextLength;
    signScheme.sch.eddsa.pContext      = (HOST_ADDR)pUserContext;

    return VerReq(HSE_ACCESS_MODE_ONE_PASS, signScheme,
                  keyHandle, muIf, muChannelIdx,
                  inputLength, pInput, bInputIsHashed, 0,
                  pRLen, pR,
                  pSLen, pS, gSyncTxOption);
}


static hseSrvResponse_t VerReq(hseAccessMode_t accessMode, hseSignScheme_t signScheme,
                               hseKeyHandle_t keyHandle, const uint8_t muIf,
                               const uint8_t muChannelIdx, uint32_t inputLength,
                               const uint8_t* pInput, bool_t bInputIsHashed, hseSGTOption_t sgtOption,
                               const uint32_t* pSignatureLength0, const uint8_t* pSignature0,
                               const uint32_t* pSignatureLength1, const uint8_t* pSignature1,
                               hseTxOptions_t txOptions)
{
    hseSrvDescriptor_t* pHseSrvDesc = &gHseSrvDesc[muIf][muChannelIdx];
    hseSignSrv_t* pSignSrv;
    memset(pHseSrvDesc, 0, sizeof(hseSrvDescriptor_t));

    pHseSrvDesc->srvId = HSE_SRV_ID_SIGN;
    pSignSrv = &(pHseSrvDesc->hseSrv.signReq);

    pSignSrv->accessMode          = accessMode;
    pSignSrv->signScheme          = signScheme;
    pSignSrv->authDir             = HSE_AUTH_DIR_VERIFY;
    pSignSrv->keyHandle           = keyHandle;
    pSignSrv->inputLength         = inputLength;
    pSignSrv->pInput              = (HOST_ADDR)pInput;
    pSignSrv->bInputIsHashed      = bInputIsHashed;
    pSignSrv->sgtOption           = sgtOption;
	pSignSrv->pSignature[0] 	  = (HOST_ADDR)pSignature0; 	   // R
	pSignSrv->pSignatureLength[0] = (HOST_ADDR)pSignatureLength0; // R len
	
	pSignSrv->pSignature[1] 	  = (HOST_ADDR)pSignature1; 	   // S
	pSignSrv->pSignatureLength[1] = (HOST_ADDR)pSignatureLength1; // S len



    return _HSE_Send(muIf, muChannelIdx, txOptions, pHseSrvDesc);
}
 
 
 

 

タグ(2)
0 件の賞賛
返信
2 返答(返信)

1,021件の閲覧回数
lukaszadrapa
NXP TechSupport
NXP TechSupport

Hi

It’s caused by endianness, most likely. There’s a note in HSE Firmware reference manual rev. 2.7 on page 118 that keys on Ed29919 curve are processed by conversion to little-endian bit strings. But HSE expects the keys in big-endian format. It’s necessary to swap the keys and also the signature.

You can use function like this for keys and for the signature:

 

void SwapArrayBytes

(

                uint8_t *pu8Source,

                uint32_t u32ByteLen

)

{

                uint32_t u32Start = (uint32_t)0U;

    uint32_t u32End   = u32ByteLen - 1U ;

    uint8_t  u8Temp   = (uint8_t)0U;

 

    if ((NULL_PTR != pu8Source) && ((uint32_t)0U != u32ByteLen))

    {

        while (u32Start < u32End)

        {

            u8Temp              = pu8Source[u32Start];

            pu8Source[u32Start] = pu8Source[u32End];

            pu8Source[u32End]   = u8Temp;

            u32Start++;

            u32End--;

        }

    }

}

 

To test the result, you can use test vectors:

https://asecuritysite.com/ecc/eddsa4

 

Regards,

Lukas

0 件の賞賛
返信

852件の閲覧回数
cij45
Contributor II

That was the key point,
Thank you very much for your support!!

0 件の賞賛
返信
%3CLINGO-SUB%20id%3D%22lingo-sub-2298523%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3EEd25519%20HSE%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E7%BD%B2%E5%90%8D%E6%A4%9C%E8%A8%BC%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2298523%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CDIV%3E%3CP%20class%3D%22%22%3E%3CSPAN%3E%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%3C%2FSPAN%3E%3C%2FP%3E%3CP%20class%3D%22%22%3E%3CSPAN%3E%E7%8F%BE%E5%9C%A8S32K312%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%3C%2FSPAN%3E%3C%2FP%3E%3CP%20class%3D%22%22%3E%3CSPAN%3EHSE%E3%81%ABEd25519%E5%85%AC%E9%96%8B%E9%8D%B5%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%80%81%E5%A4%96%E9%83%A8%E3%81%A7%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%9F%E7%BD%B2%E5%90%8D%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E3%81%97%E3%81%8B%E3%81%97%E3%80%81%E6%A4%9C%E8%A8%BC%E3%81%A7%E5%B8%B8%E3%81%AB%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%3C%2FSPAN%3E%3CSTRONG%3E%3CSPAN%3E0x55A5A164UL%3C%2FSPAN%3E%3C%2FSTRONG%3E%E3%81%8C%E8%BF%94%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%3CSPAN%3E%E3%80%82%3C%2FSPAN%3E%3C%2FP%3E%3CP%20class%3D%22%22%3E%3CSPAN%3EEd25519%20%E6%A4%9C%E8%A8%BC%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AB%E5%95%8F%E9%A1%8C%E3%81%8C%E3%81%82%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82%3C%2FSPAN%3E%3C%2FP%3E%3CP%20class%3D%22%22%3E%3CSPAN%3E*%20%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%82%E3%82%8C%E3%81%B0%E3%80%81%3C%2FSPAN%3E%3CSPAN%3E%20S32K312%20%E4%B8%8A%E3%81%AE%20HSE%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%20Ed25519%20%E7%BD%B2%E5%90%8D%E6%A4%9C%E8%A8%BC%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%3C%2FSPAN%3E%3CSTRONG%3E%3CSPAN%3E%20%E3%83%87%E3%83%A2%20%E3%82%B3%E3%83%BC%E3%83%89%E3%81%BE%E3%81%9F%E3%81%AF%E5%8F%82%E8%80%83%E4%BE%8B%20%E3%82%82%E5%85%B1%E6%9C%89%E3%81%97%E3%81%A6%E3%81%84%E3%81%9F%E3%81%A0%E3%81%91%E3%82%8B%E3%81%A8%E5%B9%B8%E3%81%84%E3%81%A7%E3%81%99%E3%80%82%3C%2FSPAN%3E%3C%2FSTRONG%3E%3C%2FP%3E%3CP%3E%3CSPAN%3E%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86%E3%81%94%E3%81%96%E3%81%84%E3%81%BE%E3%81%99%3C%2FSPAN%3E%3CSPAN%3E%EF%BC%81%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3C%2FDIV%3E%3CPRE%20class%3D%22lia-code-sample%20language-c%22%3E%3CCODE%20translate%3D%22no%22%3Econst%20uint8_t%20eccPubKey%5B32%5D%20%3D%20%7BEd25519%20public%20key%7D%3B%0A%0AImportEccKeyReq(NVM_ECC_SECUREBOOT_HANDLE%2C%20HSE_KEY_TYPE_ECC_PUB%2C%20HSE_KF_USAGE_VERIFY%20%7C%20HSE_KF_USAGE_AUTHORIZATION%2C%09%09%09%09%09%20%20%20%09%09%09%09HSE_EC_25519_ED25519%2C%20256%2C%20(HOST_ADDR)eccPubKey%2C%20NULL)%3B%0A%0Auint8_t%20demo_plain%5B16%5D%3D%20%7Binput%20value%20not%20hashed%20%7D%3B%0Auint8_t%20rsignature%5B32%5D%3D%20%7BFirst%2032%20signature%7D%3B%0Auint8_t%20ssignature%5B32%5D%3D%20%7BLast%2032%20signature%7D%3B%0Auint32_t%20demo_sigsize%5B1%5D%20%3D%20%7B32%7D%3B%0A%09%20%0AEddsaVerify(NVM_ECC_SECUREBOOT_HANDLE%2C%20FALSE%2C%2016%2C%20(uint8_t*)demo_plain%2C%20FALSE%2C%200%2C%200%2C%20demo_sigsize%2C%20rsignature%2C%20demo_sigsize%2C%20ssignature)%3B%0A%0A%3C%2FCODE%3E%3C%2FPRE%3E%3CBR%20%2F%3E%3CPRE%20class%3D%22lia-code-sample%20language-c%22%3E%3CCODE%20translate%3D%22no%22%3EhseSrvResponse_t%20EddsaVerify(hseKeyHandle_t%20keyHandle%2C%20bool_t%20bHashEddsa%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uint32_t%20inputLength%2C%20const%20uint8_t*%20pInput%2C%20bool_t%20bInputIsHashed%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20uint8_t%20userContextLength%2C%20const%20uint8_t*%20pUserContext%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20uint32_t*%20pRLen%2C%20const%20uint8_t*%20pR%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20uint32_t*%20pSLen%2C%20const%20uint8_t*%20pS)%0A%7B%0A%20%20%20%20hseSignScheme_t%20signScheme%3B%0A%0A%20%20%20%20signScheme.signSch%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3D%20HSE_SIGN_EDDSA%3B%0A%20%20%20%20signScheme.sch.eddsa.bHashEddsa%20%20%20%20%3D%20bHashEddsa%3B%0A%20%20%20%20signScheme.sch.eddsa.contextLength%20%3D%20userContextLength%3B%0A%20%20%20%20signScheme.sch.eddsa.pContext%20%20%20%20%20%20%3D%20(HOST_ADDR)pUserContext%3B%0A%0A%20%20%20%20return%20VerReq(HSE_ACCESS_MODE_ONE_PASS%2C%20signScheme%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20keyHandle%2C%20muIf%2C%20muChannelIdx%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inputLength%2C%20pInput%2C%20bInputIsHashed%2C%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pRLen%2C%20pR%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pSLen%2C%20pS%2C%20gSyncTxOption)%3B%0A%7D%0A%0A%0Astatic%20hseSrvResponse_t%20VerReq(hseAccessMode_t%20accessMode%2C%20hseSignScheme_t%20signScheme%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hseKeyHandle_t%20keyHandle%2C%20const%20uint8_t%20muIf%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20uint8_t%20muChannelIdx%2C%20uint32_t%20inputLength%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20uint8_t*%20pInput%2C%20bool_t%20bInputIsHashed%2C%20hseSGTOption_t%20sgtOption%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20uint32_t*%20pSignatureLength0%2C%20const%20uint8_t*%20pSignature0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20uint32_t*%20pSignatureLength1%2C%20const%20uint8_t*%20pSignature1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hseTxOptions_t%20txOptions)%0A%7B%0A%20%20%20%20hseSrvDescriptor_t*%20pHseSrvDesc%20%3D%20%26amp%3BgHseSrvDesc%5BmuIf%5D%5BmuChannelIdx%5D%3B%0A%20%20%20%20hseSignSrv_t*%20pSignSrv%3B%0A%20%20%20%20memset(pHseSrvDesc%2C%200%2C%20sizeof(hseSrvDescriptor_t))%3B%0A%0A%20%20%20%20pHseSrvDesc-%26gt%3BsrvId%20%3D%20HSE_SRV_ID_SIGN%3B%0A%20%20%20%20pSignSrv%20%3D%20%26amp%3B(pHseSrvDesc-%26gt%3BhseSrv.signReq)%3B%0A%0A%20%20%20%20pSignSrv-%26gt%3BaccessMode%20%20%20%20%20%20%20%20%20%20%3D%20accessMode%3B%0A%20%20%20%20pSignSrv-%26gt%3BsignScheme%20%20%20%20%20%20%20%20%20%20%3D%20signScheme%3B%0A%20%20%20%20pSignSrv-%26gt%3BauthDir%20%20%20%20%20%20%20%20%20%20%20%20%20%3D%20HSE_AUTH_DIR_VERIFY%3B%0A%20%20%20%20pSignSrv-%26gt%3BkeyHandle%20%20%20%20%20%20%20%20%20%20%20%3D%20keyHandle%3B%0A%20%20%20%20pSignSrv-%26gt%3BinputLength%20%20%20%20%20%20%20%20%20%3D%20inputLength%3B%0A%20%20%20%20pSignSrv-%26gt%3BpInput%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3D%20(HOST_ADDR)pInput%3B%0A%20%20%20%20pSignSrv-%26gt%3BbInputIsHashed%20%20%20%20%20%20%3D%20bInputIsHashed%3B%0A%20%20%20%20pSignSrv-%26gt%3BsgtOption%20%20%20%20%20%20%20%20%20%20%20%3D%20sgtOption%3B%0A%09pSignSrv-%26gt%3BpSignature%5B0%5D%20%09%20%20%3D%20(HOST_ADDR)pSignature0%3B%20%09%20%20%20%2F%2F%20R%0A%09pSignSrv-%26gt%3BpSignatureLength%5B0%5D%20%3D%20(HOST_ADDR)pSignatureLength0%3B%20%2F%2F%20R%20len%0A%09%0A%09pSignSrv-%26gt%3BpSignature%5B1%5D%20%09%20%20%3D%20(HOST_ADDR)pSignature1%3B%20%09%20%20%20%2F%2F%20S%0A%09pSignSrv-%26gt%3BpSignatureLength%5B1%5D%20%3D%20(HOST_ADDR)pSignatureLength1%3B%20%2F%2F%20S%20len%0A%0A%0A%0A%20%20%20%20return%20_HSE_Send(muIf%2C%20muChannelIdx%2C%20txOptions%2C%20pHseSrvDesc)%3B%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CDIV%3E%26nbsp%3B%3C%2FDIV%3E%3CDIV%3E%26nbsp%3B%3C%2FDIV%3E%3CDIV%3E%26nbsp%3B%3C%2FDIV%3E%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2299226%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20Ed25519%20Signature%20verification%20in%20HSE%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2299226%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E3%83%8F%E3%82%A4%3C%2FP%3E%0A%3CP%3E%E3%81%8A%E3%81%9D%E3%82%89%E3%81%8F%E3%80%81%E3%81%93%E3%82%8C%E3%81%AF%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%99%E3%80%82HSE%E3%83%95%E3%82%A1%E3%83%BC%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%ABrev.%E3%81%AB%E6%B3%A8%E8%A8%98%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82118%20%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%202.7%20%E3%81%A7%E3%81%AF%E3%80%81Ed29919%20%E6%9B%B2%E7%B7%9A%E4%B8%8A%E3%81%AE%E3%82%AD%E3%83%BC%E3%81%AF%E3%83%AA%E3%83%88%E3%83%AB%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3%20%E3%83%93%E3%83%83%E3%83%88%E6%96%87%E5%AD%97%E5%88%97%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%87%A6%E7%90%86%E3%81%95%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E8%AA%AC%E6%98%8E%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E3%81%97%E3%81%8B%E3%81%97%E3%80%81HSE%20%E3%81%A7%E3%81%AF%E3%82%AD%E3%83%BC%E3%81%8C%E3%83%93%E3%83%83%E3%82%B0%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3%E5%BD%A2%E5%BC%8F%E3%81%A7%E8%A6%81%E6%B1%82%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E3%82%AD%E3%83%BC%E3%81%A8%E7%BD%B2%E5%90%8D%E3%82%92%E4%BA%A4%E6%8F%9B%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%0A%3CP%3E%E3%82%AD%E3%83%BC%E3%81%A8%E7%BD%B2%E5%90%8D%E3%81%AB%E3%81%AF%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%0A%3CBR%20%2F%3E%0A%3CP%3Evoid%20%E3%82%B9%E3%83%AF%E3%83%83%E3%83%97%E9%85%8D%E5%88%97%E3%83%90%E3%82%A4%E3%83%88%3C%2FP%3E%0A%3CP%3E%EF%BC%88%3C%2FP%3E%0A%3CP%3Euint8_t%20*pu8%E3%82%BD%E3%83%BC%E3%82%B9%E3%80%81%3C%2FP%3E%0A%3CP%3Euint32_t%20u32%E3%83%90%E3%82%A4%E3%83%88%E9%95%B7%3C%2FP%3E%0A%3CP%3E%EF%BC%89%3C%2FP%3E%0A%3CP%3E%7B%3C%2FP%3E%0A%3CP%3Euint32_t%20u32Start%20%3D%20(uint32_t)0U%3B%3C%2FP%3E%0A%3CP%3Euint32_t%20u32End%20%3D%20u32ByteLen%20-%201U%20%3B%3C%2FP%3E%0A%3CP%3Euint8_t%20u8Temp%20%3D%20(uint8_t)0U%3B%3C%2FP%3E%0A%3CBR%20%2F%3E%0A%3CP%3Eif%20((NULL_PTR%20!%3D%20pu8Source)%20%26amp%3B%26amp%3B%20((uint32_t)0U%20!%3D%20u32ByteLen))%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%20%7B%3C%2FP%3E%0A%3CP%3E(u32Start%20%26lt%3B%20u32End)%20%E3%81%AE%E9%96%93%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%20%7B%3C%2FP%3E%0A%3CP%3Eu8Temp%20%3D%20pu8Source%5Bu32Start%5D%3B%3C%2FP%3E%0A%3CP%3Epu8Source%5Bu32Start%5D%20%3D%20pu8Source%5Bu32End%5D%3B%3C%2FP%3E%0A%3CP%3Epu8Source%5Bu32End%5D%20%3D%20u8Temp%3B%3C%2FP%3E%0A%3CP%3Eu32Start%2B%2B%3B%3C%2FP%3E%0A%3CP%3Eu32End--%3B%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%20%7D%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B%20%7D%3C%2FP%3E%0A%3CP%3E%7D%3C%2FP%3E%0A%3CBR%20%2F%3E%0A%3CP%3E%E7%B5%90%E6%9E%9C%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%80%81%E3%83%86%E3%82%B9%E3%83%88%20%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%0A%3CP%3E%3CA%20href%3D%22https%3A%2F%2Fasecuritysite.com%2Fecc%2Feddsa4%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%3Ehttps%3A%2F%2Fasecuritysite.com%2Fecc%2Feddsa4%3C%2FA%3E%3C%2FP%3E%0A%3CBR%20%2F%3E%0A%3CP%3E%E3%82%88%E3%82%8D%E3%81%97%E3%81%8F%E3%81%8A%E9%A1%98%E3%81%84%E3%81%84%E3%81%9F%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%0A%3CP%3E%E3%83%AB%E3%83%BC%E3%82%AB%E3%82%B9%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2300595%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20Ed25519%20Signature%20verification%20in%20HSE%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2300595%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%3CSPAN%3E%E3%81%9D%E3%82%8C%E3%81%8C%E9%87%8D%E8%A6%81%E3%81%AA%E7%82%B9%E3%81%A7%E3%81%99%E3%80%82%3C%2FSPAN%3E%3CBR%20%2F%3E%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%81%A6%E3%81%84%E3%81%9F%E3%81%A0%E3%81%8D%E8%AA%A0%E3%81%AB%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86%E3%81%94%E3%81%96%E3%81%84%E3%81%BE%E3%81%99%EF%BC%81%EF%BC%81%3C%2FP%3E%3C%2FLINGO-BODY%3E