• JNA结构体嵌套如何调用


    一、C语言结构体

    typedef struct ECCrefPublicKey_st {
    unsigned int bits;
    unsigned char x[ECCref_MAX_LEN];
    unsigned char y[ECCref_MAX_LEN];
    }ECCrefPublicKey;
    
    
    
    typedef struct ECCCipher_st {
    unsigned char x[ECCref_MAX_LEN];
    unsigned char y[ECCref_MAX_LEN];
    unsigned char M[32];
    unsigned int L;
    unsigned char C[1024];
    }ECCCipher;
    
    
    
    typedef ECCCipher ECCCIPHERBLOB;
    typedef ECCrefPublicKey ECCPUBLICKEYBLOB;
    
    
    
    typedef struct SDF_ENVELOPEDKEYBLOB {
    unsigned long ulAsymmAlgID;
    unsigned long ulSymmAlgID;
    ECCCIPHERBLOB ECCCipherBlob;
    ECCPUBLICKEYBLOB PubKey;
    unsigned char cbEncryptedPriKey[ECCref_MAX_LEN];
    }ENVELOPEDKEYBLOB, * PENVELOPEDKEYBLOB;

    二、C语言接口

    //生成ECC密钥对的保护结构
    int SDF_Ext_GenEnvKeyPairBlob_ECC(void* hSessionHandle,
    unsigned int symmAlgID,
    ECCrefPublicKey* pucPublicKey,
    ENVELOPEDKEYBLOB* pEnvelopedKeyBlob);

    三、jna接口

    int SDF_Ext_GenEnvKeyPairBlob_ECC(Pointer var1, NativeLong var2, ECCrefPublicKey.ByReference pucPublicKey, ENVELOPEDKEYBLOB.ByReference blob);

    四、JNA结构体

     class ENVELOPEDKEYBLOB extends Structure {
                public NativeLong ulAsymmAlgID;
                public NativeLong ulSymmAlgID;
                public ECCCipher ECCCipherBlob;
                public ECCrefPublicKey PubKey;
                public byte[] cbEncryptedPriKey = new byte[64];
    
                @Override
                protected List getFieldOrder() {
                    return Arrays.asList("ulAsymmAlgID", "ulSymmAlgID", "ECCCipherBlob", "PubKey", "cbEncryptedPriKey");
    
                }
    
                public static class ByValue extends ENVELOPEDKEYBLOB implements Structure.ByValue {
                    public ByValue() {
                    }
                }
    
                public static class ByReference extends ENVELOPEDKEYBLOB implements Structure.ByReference {
                    public ByReference() {
                    }
                }
            }
     
    public static class ECCCipher extends Structure {
                public byte[] x = new byte[64];
                public byte[] y = new byte[64];
                public byte[] M = new byte[32];
                public int L;
                public byte[] C = new byte[1024];
    
                public static class ByValue extends ECCCipher implements Structure.ByValue {
                    public ByValue() {
                    }
                }
    
                public static class ByReference extends ECCCipher implements Structure.ByReference {
                    public ByReference() {
                    }
                }
            }
    class ECCrefPublicKey extends Structure {
                public int bits;
                public byte[] x = new byte[64];
                public byte[] y = new byte[64];
    
                
                @Override
                protected List<String> getFieldOrder() {
                    return Arrays.asList(new String[] {"bits", "x","y"});
                }
    
                @Override
                public String toString() {
                    return JSON.toJSONString(this);
                }
    
                public static class ByValue extends ECCrefPublicKey implements Structure.ByValue {
                    public ByValue() {
    
                    }
                }
    
                public static class ByReference extends ECCrefPublicKey implements Structure.ByReference {
                    public ByReference() {
    
                    }
                }
            }

    五、jna调用demo

    TestSDF_API.TestCLibrary.ECCCipher ECCCipherBlob = new TestSDF_API.TestCLibrary.ECCCipher();
    TestSDF_API.TestCLibrary.ECCrefPublicKey pubKey = new TestSDF_API.TestCLibrary.ECCrefPublicKey();
    TestSDF_API.TestCLibrary.ENVELOPEDKEYBLOB.ByReference pEnvelopedKeyBolb = new TestSDF_API.TestCLibrary.ENVELOPEDKEYBLOB.ByReference();
    pEnvelopedKeyBolb.setECCCipherBlob(ECCCipherBlob);
    pEnvelopedKeyBolb.setPubKey(pubKey);
    pEnvelopedKeyBolb.setCbEncryptedPriKey(new byte[64]);
    rv = api.Test_SDF_Ext_GenEnvKeyPairBlob_ECC(hSessionHandle, sm4, EncPubKey, pEnvelopedKeyBolb);

    搞定。

    需要详细教程的加QQ:1059585163

  • 相关阅读:
    Fedora/centos Linux如何设置网卡自动获取网络地址
    Django virtualenv Apache2 mod_wsgi
    virtualbox在装centos5.6时自协把virtualbox addon 装上了
    Spring中的事务属性介绍以及声明式事务管理
    Fedora Linux如何设置网卡自动获取网络地址
    Linux vi/vim 编辑命令总结
    about reviewboard stack information
    Installing Python 2.7.2 on Centos 5.2
    Linux Deepin 下载
    Can't open file for writing
  • 原文地址:https://www.cnblogs.com/caozyblogs/p/15578252.html
Copyright © 2020-2023  润新知