# CISSSDK的接口【应用APP使用】

备注:大部分的接口需使用线程调用。

# 连接卡

  • 定义:
连接卡接口
接口名称 connectSimKey
接口描述 建立和卡的连接
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
connectConfig ConnectConfig 连接配置
progressListener CISSProgressListener 进度提示 异步回调提示和结果,可以为空

ConnectConfig定义:

返回值 方法和描述
ConnectConfig.Builder newBuilder()

ConnectConfig.Builder定义

返回值 方法和描述
ConnectConfig.Builder useOMA() 使用OMA通道, 不需要网络
ConnectConfig.Builder useBleByMac(String mac) 使用蓝牙卡的mac地址来进行蓝牙连接, 不需要网络
ConnectConfig.Builder useBleByPhone(String phone) 使用手机号来进行蓝牙连接, 需要网络
ConnectConfig.Builder useBleByICCID() 使用系统api读取ICCID来进行蓝牙连接, 需要网络。在Android 10及以上的手机上无法获取到ICCID
ConnectConfig.Builder useBleByScan() 使用蓝牙扫描来进行蓝牙连接, 不需要网络
ConnectConfig.Builder useBleByScanIfICCIDAbsent() 如果系统api读取不到ICCID则扫描蓝牙来进行蓝牙连接, 需要网络
ConnectConfig.Builder notifyConnectResult() 通知连接结果, 用于排查错误。需要网络
ConnectConfig build()

​ 注意:如果要用蓝牙连接方式,那么使用其中一种就行了,如果传入多个,则最后一个设置生效,之前的会被覆盖。

  • 返回类型:boolean
  • 代码示例
//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //code:错误代码 msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //使用手机号码连接, 推荐方式
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();

        //使用手机mac地址连接, 离线使用场景下推荐使用此方式
        ConnectConfig connectConfigMac = ConnectConfig.newBuilder()
                                         .useOMA()
                                         .useBleByMac("00:B7:1D:0A:A5:01")
                                         .build();

        //连接
        boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
        Log.d(TAG, "连接结果:" + connect);
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  • 返回:true 成功连接到卡,false 失败

# 读取证书

  • 定义:
读取证书接口
接口名称 readCer
接口描述 读取证书, 如果没有返回空
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
cerType boolean 证书类型 true:签名证书
false:加密证书
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回类型:byte[] 返回 byte数组,成功获取cer,返回null ,获取失败。

  • 代码示例

//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();


        //连接
        boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }

        //读取证书
        boolean isSign = true;
        byte[] cer = cisssdk.readCer(getContext(), isSign, progressListener);
        Log.d(TAG, "证书长度:" + cer.length);
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

# 签名

  • 定义:
签名接口
接口名称 privSign
接口描述 用签名密钥对的私钥对 Hash串/原文 进行签名. sm2的签名值以(r||s)的格式返回,64字节
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
data byte[] 原文 不能为空
dataType int 数据类型 0:原文1(在0016的预处理的基础上,对原文多做了一次sm3).
1: hash值
2: 原文2( 按照0016的预处理操作 )
区别在于是否需要经过hash
推荐使用CissInterConst.SignDataType里面的常量定义
pinFlag int 是否输入pin (目前没有作用,强制弹窗) 0: 不用输入
1:需要输入
推荐使用CissInterConst.IsNeedPin里面的常量定义
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回类型:byte[]

  • 代码示例

//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();


        boolean connect = cisssdk.connectSimKey(getContext(),
                                                connectConfig,
                                                progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }

        //签名
        String plain = "hello Simkey!";
        byte[] sign = cisssdk.privSign(getContext(),
                                       plain.getBytes(),
                                       SignDataType.PLAIN,
                                       IsNeedPin.NEED_PIN,
                                       progressListener);
        Log.d(TAG, "签名结果长度:" + sign.length);
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

备注:"hello Simkey!"为签名数据,系统正式上线后需要改成有意义的文字,签名验签成功后,签名数据具有法律效应。

  • 返回十六进制显示:
DD5F976A79F326D2727660D246440BA35B853FAC16B96179F8B275261B00E58C0FFF4D22C5F18FDE58F51C372D22B45A9213C3D97B97D77E3B91858E2BCFC01E
1

# P1签名

  • 定义:
签名接口
接口名称 privSignP1
接口描述 用签名密钥对的私钥对 Hash串/原文 进行签名,PKCS#1格式返回
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
data byte[] 原文 不能为空
dataType int 数据类型 0:原文1(在0016的预处理的基础上,对原文多做了一次sm3).
1: hash值
2: 原文2( 按照0016的预处理操作 )
区别在于是否需要经过hash
推荐使用CissInterConst.SignDataType里面的常量定义
pinFlag int 是否输入pin (目前没有作用,强制弹窗) 0: 不用输入
1:需要输入
推荐使用CissInterConst.IsNeedPin里面的常量定义
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回类型:byte[]

  • 代码示例

//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();


        boolean connect = cisssdk.connectSimKey(getContext(),
                                                connectConfig,
                                                progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }

        //签名
        String plain = "hello Simkey!";
        byte[] sign = cisssdk.privSignP1(getContext(),
                                       plain.getBytes(),
                                       SignDataType.PLAIN,
                                       IsNeedPin.NEED_PIN,
                                       progressListener);
        Log.d(TAG, "签名结果长度:" + sign.length);
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

备注:"hello Simkey!"为签名数据,系统正式上线后需要改成有意义的文字,签名验签成功后,签名数据具有法律效应。

  • 返回十六进制显示:
304402202E12D60DFD16CB883811525D0E31D4C37898422CE6D25B7C9AB5471374984C8F022078AB926BD4E2094DAF2ACD5FA61A672BE11B3DA22B016AD0057634C18236A617
1

# P7签名

  • 定义:
签名接口
接口名称 privSignP7
接口描述 用签名密钥对的私钥对 原文 进行签名,PKCS#7格式返回, 目前仅支持国密算法
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
data byte[] 原文 不能为空
dataType int 数据类型 0:原文1(在0016的预处理的基础上,对原文多做了一次sm3).
2: 原文2( 按照0016的预处理操作 )
推荐使用CissInterConst.SignDataType里面的常量定义
pinFlag int 是否输入pin (目前没有作用,强制弹窗) 0: 不用输入
1:需要输入
推荐使用CissInterConst.IsNeedPin里面的常量定义
attach boolean 是否为attach模式 true: attach模式, 返回结果带原文
false:detach模式, 返回结果不带原文
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回类型:byte[]

  • 代码示例

//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();


        boolean connect = cisssdk.connectSimKey(getContext(),
                                                connectConfig,
                                                progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }

        //签名
        String plain = "hello Simkey!";
        byte[] sign = cisssdk.privSignP7(getContext(),
                                       plain.getBytes(),
                                       SignDataType.PLAIN,
                                       IsNeedPin.NEED_PIN,
                                       true, /*attach模式*/  
                                       progressListener);
        Log.d(TAG, "签名结果长度:" + sign.length);
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

备注:"hello Simkey!"为签名数据,系统正式上线后需要改成有意义的文字,签名验签成功后,签名数据具有法律效应。

  • 返回十六进制显示:
30820563060A2A811CCF550601040202A08205533082054F020101310E300C06082A811CCF550183110500301D060A2A811CCF550601040201A00F040D68656C6C6F2053696D6B657921A08204503082044C308203F3A003020102020A2ACC4C3A8D42DBABF70E300A06082A811CCF5501837530818A310B300906035504061302434E31343032060355040A0C2B53494D4B4559205355424F5244494E41544520434120436572746966696361746520417574686F726974793121301F06035504030C1853494D4B45594341205355424F5244494E41544520534D323110300E06035504080C074A69616E6753753110300E06035504070C074E616E4A696E67301E170D3231303830323031323935375A170D3232303830323031323935375A304A310F300D06035504030C06E982B9E5AE8131143012060355040A0C0B4349535320E5BA94E794A831143012060355040B0C0B3138313638303536363636310B300906035504061302434E3059301306072A8648CE3D020106082A811CCF5501822D0342000483628572D7061F9F77792E2DF52462B3662196C8E3DFD37AAAA551B6DE47C870A5E79D23C78C3B9F35357CACA6A75D4A9E6D2B30ABE4C36FEE8464B8EBC2C151A382027E3082027A3081AD0603551D230481A53081A280145321FDEC21B5D1DF6D5941FC09C41369C0473903A17EA47C307A310B300906035504061302434E312B3029060355040A0C2253494D4B45594341524F4F5420436572746966696361746520417574686F72697479311A301806035504030C1153494D4B4559434120524F4F5420534D323110300E06035504080C074A69616E6753753110300E06035504070C074E616E4A696E67820A2ACC40D95A9658239CDD301D0603551D0E041604143A70DD60CC0E749FC3CF4E1B44E78A4B33462E94300E0603551D0F0101FF0404030206C030480603551D200441303F303D06082B060105050702013031302F06082B06010505070201162368747470733A2F2F73696D6B65792E61736961696E666F2D7365632E636F6D2F6370733081B50603551D1F0481AD3081AA3081A7A025A023862168747470733A2F2F73696D6B65792E746563682F73696D6B65792D736D2E63726CA27EA47C307A310B300906035504061302434E312B3029060355040A0C2253494D4B45594341524F4F5420436572746966696361746520417574686F72697479311A301806035504030C1153494D4B4559434120524F4F5420534D323110300E06035504080C074A69616E6753753110300E06035504070C074E616E4A696E67307606082B06010505070101046A3068303406082B06010505073002862868747470733A2F2F73696D6B65792E61736961696E666F2D7365632E636F6D2F726F6F742E637274303006082B06010505073001862468747470733A2F2F73696D6B65792E61736961696E666F2D7365632E636F6D2F6F637370300C0603551D130101FF04023000301106096086480186F8420101040403020780300A06082A811CCF55018375034700304402204ACDB2BBF1832CD1C59D41258567CC9A3FA4F31ADCE11AE172D5750B89DAAAC8022050D83B4E7B28421FB554D4BA12183D4A599BF214D05245749E4A7D57C6E54FF83181C63081C30201013058304A310F300D06035504030C06E982B9E5AE8131143012060355040A0C0B4349535320E5BA94E794A831143012060355040B0C0B3138313638303536363636310B300906035504061302434E020A2ACC4C3A8D42DBABF70E300C06082A811CCF550183110500300D06092A811CCF5501822D01050004473045022100D1DB527C88DCEC48C64EE863EDC90E852D26B1B17A8C2220C6F4E7787DBAB73602200975D053536FC0B09C01EA8098D8431B1CBC4B8A0D262E61D1EC9420BAFFA075
1

# 公钥加密

  • 定义:
加密接口
接口名称 pubKeyEncrypt
接口描述 用密钥对的公钥对数据进行加密
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
cerType boolean 是否是签名密钥对加密 true:使用签名公钥加密;
false:使用加密公钥加密
data byte[] 要加密的数据
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回:byte[] 数组

  • 代码示例

//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();

        boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }

        //公钥加密
        String plain = "hello Simkey!";
        boolean isSign = true;
        byte[] cipher = cisssdk.pubKeyEncrypt(getContext(),
                                              isSign,
                                              plain.getBytes(),
                                              progressListener);
        Log.d(TAG, "公钥加密密文长度:" + cipher.length);
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

# 私钥解密

  • 定义:
解密接口
接口名称 priKeyDecrypt
接口描述 用密钥对的私钥对密文进行解密
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
data byte[] 密文
cerType boolean 是否是签名密钥对加密 true:使用签名私钥解密;
false:使用加密私钥解密
pinFlag String 是否需要输入pin(目前没有作用,强制弹窗) 0:不用输入
1:需要输入
progressListener CISSProgressListener 当前进度描述 异步回调提示和结果,可以为空
  • 代码示例
//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();

        boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }

        //公钥加密
        String plain = "hello Simkey!";
        boolean isSign = true;
        byte[] cipher = cisssdk.pubKeyEncrypt(getContext(),
                                              isSign,
                                              plain.getBytes(),
                                              progressListener);
        Log.d(TAG, "公钥加密密文长度:" + cipher.length);

        //私钥解密
        byte[] deCipher = cisssdk.priKeyDecrypt(getContext(),
                                                cipher,
                                                isSign,
                                                IsNeedPin.NEED_PIN,
                                                progressListener);
        Log.d(TAG, "私钥解密结果:" + new String(deCipher));
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

# 修改pin码

  • 定义:
修改pin码接口
接口名称 modifyPin
接口描述 修改pin码
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回类型:boolean
  • 代码示例
//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();

        boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }

        //修改pin
        boolean success = cisssdk.modifyPin(getContext(), progressListener);
        Log.d(TAG, "修改pin结果:" + success);
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  • 返回:true 成功连接到卡,false 失败

# 申请重置Pin

  • 定义:
申请重置pin码接口
接口名称 applyResetUKeyPin
接口描述 申请重置pin码
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回类型:boolean
  • 代码示例
//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        try {
            //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
            CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

            //CISSProgressListener:进度监听, 如果不想监听可以传入null
            CISSProgressListener progressListener = new CISSProgressListener() {
                @Override
                public void onProgressListenNormal(String msg) {
                    //此处为正常提示
                    Log.d(TAG, "msg:" + msg);
                }

                @Override
                public void onProgressListenError(int errorCode, String errorMsg) {
                    //此处为错误信息
                    //ErrorCode:错误代码
                    //msg: 错误描述
                    Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
                }
            };

            //连接
            ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                          .useOMA()
                                          .useBleByPhone("13777777777")//需要联网
                                          .notifyConnectResult()
                                          .build();

            boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
            Log.d(TAG, "连接结果:" + connect);
            if (!connect) {
                Log.w(TAG, "连接失败!");
                return;
            }

            //申请重置pin
            boolean success = cisssdk.applyResetUKeyPin(getContext(), progressListener);
            Log.d(TAG, "申请重置pin:" + success);

        } catch (Exception e) {
            Log.e(TAG, e.getMessage(), e);
        }
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
  • 返回:true 申请重置成功,false 申请重置失败

# 重置Pin

  • 定义:
重置pin码接口
接口名称 resetPin
接口描述 重置pin码
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回类型:boolean
  • 代码示例
//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();

        boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }

        //重置pin, 需要平台审核通过
        boolean success = cisssdk.resetPin(getContext(), progressListener);
        Log.d(TAG, "重置pin结果:" + success);
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  • 返回:true 重置成功,false 重置失败

# 获取手机号

  • 定义:
获取手机号接口
接口名称 getPhoneNumber
接口描述 获取手机号码
Sdk 不保证手机是否和卡一致,手机合法性由应用APP保证,
获取手机号接口仅作为参考。
卡仅作为U盾使用,保证签名合法性
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回类型:String
  • 代码示例
//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();

        boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }

        // 获取手机号
        String phoneNumber = cisssdk.getPhoneNumber(getContext(), progressListener);
        Log.d(TAG, "手机号码:" + phoneNumber);
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  • 返回:String类型手机号

# 上传日志

  • 定义:
上传日志
接口名称 uploadLogFile
接口描述 上传日志
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回类型:boolean
  • 代码示例
//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        // 上传日志
        boolean success = cisssdk.uploadLogFile(getContext(), progressListener);
        Log.d(TAG, "上传日志结果:" + success);
    }
};
es.submit(runnable);


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  • 返回: boolean值,判断日志是否上传成功

# 设置PIN弹窗回调监听

  • 定义:
回调监听接口
接口名称 setObjectListener
接口描述 设置PIN弹出回调监听(创建CISSSDK对象后监听), 监听PIN输入框的显示和隐藏状态
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
objectListener CISSObjectListener 监听回调 异步回调
  • 返回类型:void
  • 代码示例
//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();

        boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }

        //设置pin弹出通知
        CISSObjectListener pinListener = new CISSObjectListener() {
            @Override
            public void onPinListener(int errorCode, String errorMsg) {
                //resultcode: 1 即将弹出输入 pin 的弹窗  2 弹窗消失
                //resultDesc: 描述
                Log.d(TAG, String.format("onPinListener:code:%d,desc:%s", errorCode, errorMsg));
            }
        };
        cisssdk.setObjectListener(pinListener);

        //签名
        String plain = "hello Simkey!";
        byte[] sign = cisssdk.privSign(getContext(),
                                       plain.getBytes(),
                                       SignDataType.PLAIN,
                                       IsNeedPin.NEED_PIN,
                                       progressListener);
        Log.d(TAG, "签名结果长度:" + sign.length);
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

# 获取OTP密码【动态口令】

  • 定义:
获取动态口令接口
接口名称 getOTP
接口描述 获取otp密码, 使用之前需要先 导入OTP Key
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
tc int 以秒为单位的口令变化周期 0<tc<=60
c byte[] 参与预算的因子 ,固定四字节,可以为空
q String 认证双方输入的挑战因子,accii码长度大于等于4 可以为空
otpLength String otp的长度, 大于等于6
progressListener CISSProgressListener 进度,提示 异步回调提示和结果,可以为空
  • 返回类型:String类型值, 长度为otpLength
  • 代码示例
//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        try {
            //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
            CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

            //CISSProgressListener:进度监听, 如果不想监听可以传入null
            CISSProgressListener progressListener = new CISSProgressListener() {
                @Override
                public void onProgressListenNormal(String msg) {
                    //此处为正常提示
                    Log.d(TAG, "msg:" + msg);
                }

                @Override
                public void onProgressListenError(int errorCode, String errorMsg) {
                    //此处为错误信息
                    //ErrorCode:错误代码
                    //msg: 错误描述
                    Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
                }
            };

            //连接
            ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                          .useOMA()
                                          .useBleByPhone("13777777777")//需要联网
                                          .notifyConnectResult()
                                          .build();

            boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
            Log.d(TAG, "连接结果:" + connect);
            if (!connect) {
                Log.w(TAG, "连接失败!");
                return;
            }

            //生成OTP
            int tc = 60;// 以秒为单位的口令变化周期 0<tc<=60
            byte[] c = Ints.toByteArrays(2147483647);//运算因子
            String q = "Simkey";//挑战因子,ascii编码, 字符串长度>=4
            int otpLength = 6;//otp的长度, 值大于等于6

            String otp = cisssdk.getOTP(getContext(), tc, c, q, otpLength, progressListener);
            Log.d(TAG, "OTP:" + otp);
        } catch (Exception e) {
            Log.e(TAG, e.getMessage(), e);
        }
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

# 检测是否需要打开蓝牙(检测oma通道的情况)

  • 定义:
检测是否需要打开蓝牙(检测oma通道的情况)
接口名称 needOpenBle
接口描述 检测是否需要打开蓝牙(检测oma通道的情况)
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
activity Activity
progressListener CISSProgressListener 进度,提示 异步回调提示和结果,可以为空
  • 返回类型:boolean类型值, true:需要打开蓝牙; false: 不需要打开蓝牙
  • 代码示例
//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================

try {
    //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
    CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

    //CISSProgressListener:进度监听, 如果不想监听可以传入null
    CISSProgressListener progressListener = new CISSProgressListener() {
        @Override
        public void onProgressListenNormal(String msg) {
            //此处为正常提示
            Log.d(TAG, "msg:" + msg);
        }

        @Override
        public void onProgressListenError(int errorCode, String errorMsg) {
            //此处为错误信息
            //ErrorCode:错误代码
            //msg: 错误描述
            Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
        }
    };

    boolean needOpenBle = cisssdk.needOpenBle(getContext(), mProgressListener);
    if (needOpenBle) {
        //ToDo:需要打开蓝牙, 动态权限申请
    }

} catch (Exception e) {
    Log.e(TAG, e.getMessage(), e);
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

# P7数字信封加密

  • 定义:
P7数字信封加密
接口名称 p7EnvelopEncrypt
接口描述 p7格式的数字信封加密, 目前仅支持国密算法
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
cert byte[] 证书 一般传入加密证书而不是签名证书
data byte[] 要加密的数据
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回:byte[] 数组

  • 代码示例

//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();

        boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }
                    
        //获取加密证书
        byte[] encCert = cisssdk.readCer(getContext(), false, progressListener);
        Log.d(TAG, "加密证书:" + HexStringConvert.parseByte2HexStr(encCert));
                    
        //要加密的数据
        byte[] plain = "simkey P7Envelop test".getBytes(StandardCharsets.UTF_8);
    
        //数字信封加密
        byte[] envelop = cisssdk.p7EnvelopEncrypt(getContext(), encCert, plain, progressListener);
                    
        Log.d(TAG, "p7数字信封加密结果:" + HexStringConvert.parseByte2HexStr(envelop));
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  • 返回十六进制显示:
30820156060A2A811CCF550601040203A0820146308201420201013181ED3081EA0201013058304A310F300D06035504030C06E982B9E5AE8131143012060355040A0C0B4349535320E5BA94E794A831143012060355040B0C0B3138313638303536363636310B300906035504061302434E020A2ACC4C3A8D42E7AFDFD7300D06092A811CCF5501822D030500047C307A022100DC22A9613A5615F43C4F6A9923FE08E3268BF36703746E2BE1E5BC122CCB00D60221008D1DA31B5F46193B84C24C2AD28521E1438C3DFF33264DA63571EE3B9172127F04207139D5BE94DDE0F297896CDFC8382BF97862F2B0E7EE6B9F8486856F2E5B1D170410A45291865324EC24FEF01A6EFFA8D43E304D060A2A811CCF550601040201301D06092A811CCF550168010404107F631A2BA904A37CD0A9542E2CF684EB802065C43EEFA0619709A8F83F089F4C80F7CE4F5BFDCD805EF57CE141F2C9978A73
1

# P7数字信封解密

  • 定义:
P7数字信封解密
接口名称 p7EnvelopDecrypt
接口描述 p7格式的数字信封解密, 目前仅支持国密算法
使用者 应用客户端
  • 输入参数:
参数 数据类型 说明 备注
context Context 上下文对象 要把当前Activity的对象传入,否则需要打开手机的悬浮窗设置
cerType boolean 是否是签名密钥对加密 true:使用签名私钥解密;
false:使用加密私钥解密
envelope byte[] 要解密的数字信封
progressListener CISSProgressListener 回调提示 异步回调提示和结果,可以为空
  • 返回:byte[] 数组

  • 代码示例

//================================================
private static final String TAG = "CISSSDKTest";
private static final ExecutorService es = Executors.newSingleThreadExecutor();

//获取到上下文:
public Activity getContext() {
    return this;
}
//================================================


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //获取CISS SDK实例, 可以使用单例模式, CISSSDKHolder源码在本章最后
        CISSSDK cisssdk = CISSSDKHolder.getInstance(getContext());

        //CISSProgressListener:进度监听, 如果不想监听可以传入null
        CISSProgressListener progressListener = new CISSProgressListener() {
            @Override
            public void onProgressListenNormal(String msg) {
                //此处为正常提示
                Log.d(TAG, "msg:" + msg);
            }

            @Override
            public void onProgressListenError(int errorCode, String errorMsg) {
                //此处为错误信息
                //ErrorCode:错误代码
                //msg: 错误描述
                Log.e(TAG, String.format("onError:code:%d,msg:%s", errorCode, errorMsg));
            }
        };

        //连接
        ConnectConfig connectConfig = ConnectConfig.newBuilder()
                                      .useOMA()
                                      .useBleByPhone("13777777777")//需要联网
                                      .notifyConnectResult()
                                      .build();

        boolean connect = cisssdk.connectSimKey(getContext(), connectConfig, progressListener);
        Log.d(TAG, "连接结果:" + connect);
        if (!connect) {
            Log.w(TAG, "连接失败!");
            return;
        }
                    
        byte[] decrypted = cisssdk.p7EnvelopDecrypt(getContext(), false, envelop, progressListener);
    
        Log.d(TAG, "p7数字信封解密结果:" + new String(decrypted, StandardCharsets.UTF_8));
    }
};
es.submit(runnable);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  • 返回 UTF-8 显示: simkey P7Envelop test

# CISSSDKHolder源码

  • 代码
import android.content.Context;

import com.asiainfo.sec.libciss.ciss.CISSSDK;
import com.asiainfo.sec.libciss.ciss.impl.CISSSDKFramImpl;

public final class CISSSDKHolder {

    private static volatile CISSSDK mInstance;

    private CISSSDKHolder() {
    }

    public static CISSSDK getInstance(Context context) {
        if (mInstance == null) {
            synchronized (CISSSDKHolder.class) {
                if (mInstance == null) {
                    mInstance = new CISSSDKFramImpl(context.getApplicationContext());
                }
            }
        }
        return mInstance;
    }
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25