发新帖本帖赏金 0.10元(功能说明)我要提问
12下一页
返回列表
打印
[STM32F1]

STM32写SIM卡解锁不成功

[复制链接]
2794|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JY-DX-JY|  楼主 | 2015-6-24 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在要用STM32F103C8T6写SIM卡。
if(((SC_Responce.SW1 << 8) | (SC_Responce.SW2)) == SC_OP_TERMINATED)     //9000
    {
   
      /* Check if the CHV1 is enabled */
      if((SC_Responce.Data[13] & 0x80) == 0x00)     //93
      {
        CHV1Status = 0x01;
   
      }
首先这里CHV1Status=0x01
然后进到这里来
/* Read Binary in IMSI ---------------------------------------------------*/
    if(CHV1Status == 0x00)
    {
      if(((SC_Responce.SW1 << 8) | (SC_Responce.SW2)) == SC_OP_TERMINATED)  //9000
      {
    USART_SendData(USART1,0x24);
      delay1(2);
        /* Enable CHV1 (PIN1) ------------------------------------------------*/
        SC_ADPU.Header.CLA = SC_CLA_GSM11;          //A0
        SC_ADPU.Header.INS = SC_ENABLE;            //28   使验证数据可被读
        SC_ADPU.Header.P1 = 0x00;
        SC_ADPU.Header.P2 = 0x01;
        SC_ADPU.Body.LC = 0x08;
        for(i = 0; i < SC_ADPU.Body.LC; i++)
        {
          SC_ADPU.Body.Data = CHV1;                                                                //const uint8_t CHV1[8] = {'0', '6', '6', '2', '1', '7', '5', '1'};我定义的数组是SIM卡的PUK号
//     USART_SendData(USART1,SC_ADPU.Body.Data);       //30 30 30 30 30 30 30 30
//      delay1(2);
        }
        while(i < LC_MAX)
        {
          SC_ADPU.Body.Data[i++] = 0;
        }
        SC_ADPU.Body.LE = 0;
        SC_Handler(&SCState, &SC_ADPU, &SC_Responce);
      }
    }
可是往下USART_SendData(USART1,SC_Responce.SW1);    //98
      delay1(2);
  USART_SendData(USART1,SC_Responce.SW2);    //40
      delay1(2);
SW1和SW2是0x98,0x40,解锁不成功。
请高手指教,谢谢!
沙发
JY-DX-JY|  楼主 | 2015-6-24 11:38 | 只看该作者
SC_ADPU.Header.CLA = SC_CLA_GSM11;
        SC_ADPU.Header.INS = SC_DISABLE;                  //26
        SC_ADPU.Header.P1 = 0x00;
        SC_ADPU.Header.P2 = 0x01;
        SC_ADPU.Body.LC = 0x08;
        for(i = 0; i < SC_ADPU.Body.LC; i++)
        {
          SC_ADPU.Body.Data[i] = CHV1[i];
        }
        while(i < LC_MAX)
        {
          SC_ADPU.Body.Data[i++] = 0;
        }
        SC_ADPU.Body.LE = 0;
        SC_Handler(&SCState, &SC_ADPU, &SC_Responce);
   USART_SendData(USART1,SC_Responce.SW1);    //98
      delay1(2);
  USART_SendData(USART1,SC_Responce.SW2);    //40
      delay1(2);
我试图禁止CHV1,也回送9840,是不是CHV1冻结啦?

使用特权

评论回复
板凳
JY-DX-JY|  楼主 | 2015-6-24 13:36 | 只看该作者
高手支招啊!

使用特权

评论回复
地板
JY-DX-JY|  楼主 | 2015-6-24 16:00 | 只看该作者
顶起来。

使用特权

评论回复
5
JY-DX-JY|  楼主 | 2015-6-24 16:04 | 只看该作者
怎么才能知道CHV1号啊?

使用特权

评论回复
6
JY-DX-JY|  楼主 | 2015-6-24 16:22 | 只看该作者
本帖最后由 JY-DX-JY 于 2015-6-24 16:23 编辑

文件访问条件的意思如下:
Always:毫无条件地执行
CHV1(持卡者验证):如果符合下面3个条件之一则执行。
       在当前会话过程中,已经发送一个正确的CHV1值到SIM
CHV1 Disable/Enable状态被设置为Disable
在当前会话过程中已经成功地UNBLOCK CHV1
现在CHV1状态设置为Enable.
要解锁或者禁止CHV1,必须知道CHV1值。
我如何才能知道SIM卡的CHV1值是多少呢?

使用特权

评论回复
7
sinshine| | 2015-6-24 16:34 | 只看该作者
JY-DX-JY 发表于 2015-6-24 16:22
文件访问条件的意思如下:Always:毫无条件地执行CHV1(持卡者验证):如果符合下面3个条件之一则执行。      ...

CHV1就是PIN1码。LZ竟然多次用puk去尝试, 估计已经被锁了,找个手机看看这张sim卡是不是正常。

使用特权

评论回复
8
JY-DX-JY|  楼主 | 2015-6-24 17:07 | 只看该作者
本帖最后由 JY-DX-JY 于 2015-6-24 17:08 编辑

谢谢!我用手机解锁了,正常了。
PIN1码是1234吗?只有4位吗?

使用特权

评论回复
9
JY-DX-JY|  楼主 | 2015-6-24 17:12 | 只看该作者
(9)VERIFY CHV
命令
CLASS
INS
P1
P2
P3
VERIFY CHV
A0
20
00
CHV
08
参数P2定义的CHV0x01CHV10x02CHV2
命令参数/数据:
字节
描述
长度
1-8
CHV
8
              这儿CHV值长度是8,PIN1码是1234,我写'1','2','3','4','0','0','0','0',可以吗?谢谢!

使用特权

评论回复
10
JY-DX-JY|  楼主 | 2015-6-24 17:18 | 只看该作者
可是收到98 40

使用特权

评论回复
11
JY-DX-JY|  楼主 | 2015-6-24 17:24 | 只看该作者
const uint8_t CHV1[8] = {'1','2','3','4','0','0','0','0'};                      //PIN1码是1234
CHV1Status=1;
。。。。。。。。。。。。。。。。。。。。。。
if(CHV1Status == 0x00)
    {
      if(((SC_Responce.SW1 << 8) | (SC_Responce.SW2)) == SC_OP_TERMINATED)  //9000
      {
    USART_SendData(USART1,0x24);
      delay1(2);
        // Enable CHV1 (PIN1) ------------------------------------------------
        SC_ADPU.Header.CLA = SC_CLA_GSM11;          //A0
        SC_ADPU.Header.INS = SC_ENABLE;            //28   Ê¹ÑéÖ¤Êý¾Ý¿É±»¶Á
        SC_ADPU.Header.P1 = 0x00;
        SC_ADPU.Header.P2 = 0x01;
        SC_ADPU.Body.LC = 0x08;
        for(i = 0; i < SC_ADPU.Body.LC; i++)
        {
          SC_ADPU.Body.Data = CHV1;
//     USART_SendData(USART1,SC_ADPU.Body.Data);       //30 30 30 30 30 30 30 30
//      delay1(2);
        }
        while(i < LC_MAX)
        {
          SC_ADPU.Body.Data[i++] = 0;
        }
        SC_ADPU.Body.LE = 0;
        SC_Handler(&SCState, &SC_ADPU, &SC_Responce);
      }
    }
    else                                     //到这儿来
    {
      if(((SC_Responce.SW1 << 8) | (SC_Responce.SW2)) == SC_OP_TERMINATED)
      {
        // Verify CHV1 (PIN1) ------------------------------------------------
        SC_ADPU.Header.CLA = SC_CLA_GSM11;
        SC_ADPU.Header.INS = SC_VERIFY;                  //20
        SC_ADPU.Header.P1 = 0x00;
        SC_ADPU.Header.P2 = 0x01;
        SC_ADPU.Body.LC = 0x08;
        for(i = 0; i < SC_ADPU.Body.LC; i++)
        {
          SC_ADPU.Body.Data = CHV1;
        }
        while(i < LC_MAX)
        {
          SC_ADPU.Body.Data[i++] = 0;
        }
        SC_ADPU.Body.LE = 0;
        SC_Handler(&SCState, &SC_ADPU, &SC_Responce);
      }
    }
  USART_SendData(USART1,SC_Responce.SW1);    //98
      delay1(2);
  USART_SendData(USART1,SC_Responce.SW2);    //40
      delay1(2);
哪儿不对啊?

使用特权

评论回复
12
JY-DX-JY|  楼主 | 2015-6-24 17:36 | 只看该作者
手机每次开机都要输入PIN码,不知怎么回事?

使用特权

评论回复
13
sinshine| | 2015-6-24 18:21 | 只看该作者
JY-DX-JY 发表于 2015-6-24 17:36
手机每次开机都要输入PIN码,不知怎么回事?

不足8位,用0xff补充。PIN码enable了以后,每次上电都需要输入pin码的。LZ在做读卡器?

使用特权

评论回复

打赏榜单

JY-DX-JY 打赏了 0.10 元 2015-06-25

14
JY-DX-JY|  楼主 | 2015-6-24 18:36 | 只看该作者
第二代身份*验证机具。谢谢你!

使用特权

评论回复
15
JY-DX-JY|  楼主 | 2015-6-24 19:23 | 只看该作者
现在CHV1的问题解决了。
我开始写电话簿。
程序如下:
const uint8_t DF[2] = {0X7F,0X10};
const uint8_t DF1[2] = {0x6f,0x3A};
。。。。。。。。。。。。。。。。。。。。。。
if(((SC_Responce.SW1 << 8) | (SC_Responce.SW2)) == SC_OP_TERMINATED)            //9000
    {
//      USART_SendData(USART1,0x13);
//      delay1(2);
      SC_ADPU.Header.CLA = SC_CLA_GSM11;      //A0
      SC_ADPU.Header.INS = SC_SELECT_FILE;     //A4
      SC_ADPU.Header.P1 = 0x00;
      SC_ADPU.Header.P2 = 0x00;
      SC_ADPU.Body.LC = 0x02;
      for(i = 0; i < SC_ADPU.Body.LC; i++)
      {
        SC_ADPU.Body.Data = DF;
      }
   
      
      SC_ADPU.Body.LE = 0;
      SC_Handler(&SCState, &SC_ADPU, &SC_Responce);
    }
//  USART_SendData(USART1,SC_Responce.SW1);
//      delay1(2);
  if(SC_Responce.SW1 == SC_EF_SELECTED)       //9F
    {
//   USART_SendData(USART1,0X14);
//      delay1(2);
   SC_ADPU.Header.CLA = SC_CLA_GSM11;      //A0
      SC_ADPU.Header.INS = SC_SELECT_FILE;     //A4
      SC_ADPU.Header.P1 = 0x00;
      SC_ADPU.Header.P2 = 0x00;
      SC_ADPU.Body.LC = 0x02;
      for(i = 0; i < SC_ADPU.Body.LC; i++)
      {
        SC_ADPU.Body.Data = DF1;
      }
   
      
      SC_ADPU.Body.LE = 0;
      SC_Handler(&SCState, &SC_ADPU, &SC_Responce);
  }
  
  if(SC_Responce.SW1 == SC_EF_SELECTED)       //9F
    {
      USART_SendData(USART1,0X24);
      delay1(2);
   SC_ADPU.Header.CLA = SC_CLA_GSM11;      //A0
      SC_ADPU.Header.INS = SC_UPDATE_BINARY;     //D6
      SC_ADPU.Header.P1 = 0x00;
      SC_ADPU.Header.P2 = 0x00;
      SC_ADPU.Body.LC = 0x01;                                                                      //我往偏移地址为00的地方写一个字节的0x55
   SC_ADPU.Body.Data[0]=0x55;
   
      SC_ADPU.Body.LE = 00;
      SC_Handler(&SCState, &SC_ADPU, &SC_Responce);
    }
  
  USART_SendData(USART1,SC_Responce.SW1);
      delay1(2);
  USART_SendData(USART1,SC_Responce.SW2);
      delay1(2);
可是收到   94 08.
怎么回事啊?我步履维艰。

使用特权

评论回复
16
598330983| | 2015-6-24 21:57 | 只看该作者
这个最后是不是已经搞定了。

使用特权

评论回复
17
JY-DX-JY|  楼主 | 2015-6-25 09:43 | 只看该作者
还没搞定。

使用特权

评论回复
18
643757107| | 2015-6-25 13:51 | 只看该作者
怎么才能知道CHV1号啊?我也想知道。

使用特权

评论回复
19
JY-DX-JY|  楼主 | 2015-6-25 14:08 | 只看该作者
本帖最后由 JY-DX-JY 于 2015-6-25 14:20 编辑

我把程序改成如下:
if(SC_Responce.SW1 == SC_EF_SELECTED)       //9F
    {
      USART_SendData(USART1,0X24);
      delay1(2);
   SC_ADPU.Header.CLA = SC_CLA_GSM11;      //A0
      SC_ADPU.Header.INS = SC_UPDATE_RECORD;     //DC
      SC_ADPU.Header.P1 = 0x00;
      SC_ADPU.Header.P2 = 0x03;
      SC_ADPU.Body.LC = 0x0f;
   SC_ADPU.Body.Data[0]=0x55;
   SC_ADPU.Body.Data[1]=0x0E;
   SC_ADPU.Body.Data[2]=0xAA;
   SC_ADPU.Body.Data[3]=0x55;
   SC_ADPU.Body.Data[4]=0x55;
   SC_ADPU.Body.Data[5]=0x55;
   SC_ADPU.Body.Data[6]=0x0E;
   SC_ADPU.Body.Data[7]=0xAA;
   SC_ADPU.Body.Data[8]=0x55;
   SC_ADPU.Body.Data[9]=0x55;
   SC_ADPU.Body.Data[10]=0x55;
   SC_ADPU.Body.Data[11]=0x0E;
   SC_ADPU.Body.Data[12]=0xAA;
   SC_ADPU.Body.Data[13]=0x55;
   SC_ADPU.Body.Data[14]=0x55;
      SC_ADPU.Body.LE = 00;
      SC_Handler(&SCState, &SC_ADPU, &SC_Responce);
    }
  
  USART_SendData(USART1,SC_Responce.SW1);
      delay1(2);
  USART_SendData(USART1,SC_Responce.SW2);
更新记录,15个字节。可是
收到67,00.P3不对。

使用特权

评论回复
20
JY-DX-JY|  楼主 | 2015-6-25 14:09 | 只看该作者
643757107 发表于 2015-6-25 13:51
怎么才能知道CHV1号啊?我也想知道。

PIN1码

使用特权

评论回复
发新帖 本帖赏金 0.10元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:晴天响霹雳,平地一声雷。

245

主题

3351

帖子

30

粉丝