相关文章推荐
刀枪不入的皮带  ·  pcap_loop() function ...·  4 天前    · 
刀枪不入的皮带  ·  Code Inside Blog | ...·  9 月前    · 
刀枪不入的皮带  ·  Python项目中import ...·  10 月前    · 
刀枪不入的皮带  ·  PySimpleGui ...·  10 月前    · 
挂过科的企鹅  ·  Java ...·  36 分钟前    · 
鼻子大的甘蔗  ·  epplus ...·  1小时前    · 
稳重的警车  ·  jquery beforeunload方法 ...·  2 小时前    · 

Dear Sir

I'd like to develop the Window APP for Mesh (like nRF Mesh).

And I've face a problem. The ECDHSecret key of the Windows side didn't match the device side(Thingy).

Theoretically, ECDHSecret key should be the same on both side.

Here is part of my code.

Generate public/private key:

private CngKey provisioner_key;
byte[] eccprivcyblob;
byte[] provisioner_pub;
private void generateKeyPairs()
        provisioner_key = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, null, new CngKeyCreationParameters { ExportPolicy = CngExportPolicies.AllowPlaintextArchiving });
        eccprivcyblob = provisioner_key.Export(CngKeyBlobFormat.EccPrivateBlob);
        provisioner_pub = provisioner_key.Export(CngKeyBlobFormat.EccPrivateBlob);
        //BCRYPT_ECDH_PUBLIC_P256_MAGIC = 0x314B4345
        ulong dwMagic = 0;
        for (int i = 3; i >= 0; --i)
            dwMagic = (dwMagic << 8 | provisioner_pub[i]);
        if (dwMagic == BCRYPT_ECDH_PUBLIC_P256_MAGIC)
            ulong keysize = 0;
            for (int i = 7; i >= 4; --i)
                keysize = (keysize << 8 | provisioner_pub[i]);
        mPublicKey = new byte[keysize * 2];
        int index = 8;
        for (int j = 0; j < mPublicKey.Length; ++index, ++j)
            mPublicKey[j] = provisioner_pub[index];
    catch (Exception e)
        WriteListBox(e.StackTrace, listBox_result, false);
GenerateSharedECDHSecret
private byte[] generateSharedECDHSecret()
    byte[] dEccPublicBlob = new byte[dPublicKey.Length + 8];
    //BCRYPT_ECDH_PUBLIC_P256_MAGIC = 0x314B4345;
    dEccPublicBlob[0] = 0x45;
    dEccPublicBlob[1] = 0x43;
    dEccPublicBlob[2] = 0x4B;
    dEccPublicBlob[3] = 0x31;
    dEccPublicBlob[4] = (byte)(dPublicKey.Length / 2);
    Array.Copy(dPublicKey, 0, dEccPublicBlob, 8, dPublicKey.Length);
    dcngKey = CngKey.Import(dEccPublicBlob, CngKeyBlobFormat.EccPublicBlob);
    var provisionerAlgo = new ECDiffieHellmanCng(provisioner_key);
    return provisionerAlgo.DeriveKeyMaterial(dcngKey);

If I miss something?

Thanks.

 
推荐文章