原理:

产生一个组随机机,写入加密IC ,再从IC 中读出来一组数,经算法计算后,判断之前的随机数和计算的结果一样,就证明此IC 为加密 IC ..因为加密算法保密和随机性比较大,防止抄板效果不错。

kernel 层:

保证 i2c 通就行。不需要额外驱动。

hardware 层,通用代码如下。如果判断没有此 IC ,就重启机子。此代码里 随机数就用的当前的时间

#define _GNU_SOURCE
#include <string.h>
#include <stdlib.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include <linux/if.h>
#include <sys/ioctl.h>
#include <netinet/ether.h>
#include <pthread.h>
#include <signal.h>
#include <utils/Log.h>
#include <cutils/log.h>
#include <hardware/hardware.h>
#include <fcntl.h>
#include <errno.h>
#include <cutils/atomic.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <string.h>
#include <time.h>
#include <sys/reboot.h>#ifdef LOG_TAG
#undef LOG_TAG
#define LOG_TAG "encrypt_ic"
#endif#define DEVICE_NAME "/dev/i2c-4"
#define MODULE_NAME "iic"
#define MODULE_AUTHOR "pcwung@163.com"  #define I2C_RETRIES 0x0701/* number of times a device address should be polled when not acknowledging */
#define I2C_TIMEOUT 0x0702/* set timeout in units of 10 ms */
#define I2C_RDWR         0x0707int fd;/*********定义struct i2c_rdwr_ioctl_data和struct i2c_msg,要和内核一致*******/struct i2c_msg {__u16 addr;     /* slave address                        */__u16 flags;#define I2C_M_TEN               0x0010  /* this is a ten bit chip address */#define I2C_M_RD                0x0001  /* read data, from slave to master */#define I2C_M_STOP              0x8000  /* if I2C_FUNC_PROTOCOL_MANGLING */#define I2C_M_NOSTART           0x4000  /* if I2C_FUNC_NOSTART */#define I2C_M_REV_DIR_ADDR      0x2000  /* if I2C_FUNC_PROTOCOL_MANGLING */#define I2C_M_IGNORE_NAK        0x1000  /* if I2C_FUNC_PROTOCOL_MANGLING */#define I2C_M_NO_RD_ACK         0x0800  /* if I2C_FUNC_PROTOCOL_MANGLING */#define I2C_M_RECV_LEN          0x0400  /* length will be first received byte */__u16 len;              /* msg length                           */__u8 *buf;              /* pointer to msg data                  */__u32 scl_rate;         /* add by kfx */};/* This is the structure as used in the I2C_RDWR ioctl call */
struct i2c_rdwr_ioctl_data {struct i2c_msg *msgs;/* pointers to i2c_msgs */int nmsgs; /* number of i2c_msgs */
}; struct i2c_rdwr_ioctl_data iic_data;
int ret;static int iic_write(unsigned char* dataBuf, unsigned char slaveAddr, unsigned char subAddr, int len) {int count = 0;unsigned char data[9];unsigned char bytes;data[0] = subAddr;memcpy(&data[1], dataBuf, 8);iic_data.nmsgs=1; (iic_data.msgs[0]).len=len; //写入地址位和数据长度(iic_data.msgs[0]).addr=slaveAddr;// 设备地址0x50(iic_data.msgs[0]).flags=0; //write(iic_data.msgs[0]).scl_rate = 100000;(iic_data.msgs[0]).buf=data;ret=ioctl(fd,I2C_RDWR,(unsigned long)&iic_data);if(ret<0){ALOGI("IIC HAL ioctl error");}  return 0;
}      static int iic_read(unsigned char* dataBuf, unsigned char slaveAddr, unsigned char subAddr, int len)
{     iic_data.nmsgs=2;(iic_data.msgs[0]).len=1; (iic_data.msgs[0]).addr=slaveAddr; //  设备地址(iic_data.msgs[0]).flags=0;//write(iic_data.msgs[0]).buf= &subAddr;(iic_data.msgs[0]).scl_rate = 100000;(iic_data.msgs[1]).len=len; (iic_data.msgs[1]).addr=slaveAddr; //  设备地址(iic_data.msgs[1]).flags=I2C_M_RD;//read(iic_data.msgs[1]).buf= dataBuf;(iic_data.msgs[1]).scl_rate = 100000;if(ioctl(fd, I2C_RDWR,(unsigned long)&iic_data)<0){ALOGE("ioctl read error");}ALOGI("IIC read HAL: 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x", dataBuf[0], dataBuf[1], dataBuf[2], dataBuf[3], dataBuf[4], dataBuf[5], dataBuf[6], dataBuf[7], dataBuf[8], dataBuf[9]);return 0;
}int main(int argc, char *argv[])
{unsigned char write_data[8];unsigned char read_data[10];unsigned char tx_data[10];unsigned char rx_data[8];struct tm *time_now;time_t time_second;time(&time_second);time_now = localtime(&time_second);memset(write_data, 0x68, 8);write_data[0] = time_now->tm_sec;write_data[1] = time_now->tm_min;write_data[2] = time_now->tm_hour;write_data[3] = time_now->tm_mday;write_data[4] = time_now->tm_mon;write_data[5] = time_now->tm_year;write_data[6] = time_now->tm_wday;if((fd = open(DEVICE_NAME, O_RDWR)) == -1) {  ALOGE("iic Stub hal: failed to open /dev/i2c-1 -- %s.", strerror(errno));return -EFAULT;  }else{    ALOGV("iic Stub hal: open %s successfully.", DEVICE_NAME); iic_data.nmsgs=2; iic_data.msgs=(struct i2c_msg*)malloc(iic_data.nmsgs*sizeof(struct i2c_msg)); if(!iic_data.msgs){ALOGE("malloc error");close(fd);exit(1);}ioctl(fd, I2C_TIMEOUT, 2);//设置超时时间ioctl(fd, I2C_RETRIES, 1);//设置重发次数}iic_write(write_data, 0x60, 0xa0, 9);iic_read(read_data,0x60,0xa0, 10);//copy the encrypt ic data to soft input memcpy(tx_data, read_data, 10);EDesEn_Crypt(tx_data, rx_data);//ALOGI("is soft we get the data: 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x", rx_data[0], rx_data[1], rx_data[2], rx_data[3], rx_data[4], rx_data[5], rx_data[6], rx_data[7]);ALOGI("is soft we get the data: %d, %d, %d, %d, %d, %d, %d, %d", rx_data[0], rx_data[1], rx_data[2], rx_data[3], rx_data[4], rx_data[5], rx_data[6], rx_data[7]);if(memcmp(write_data, rx_data, 8) == 0 )ALOGD("read encrypt ic OKay & the devices is hello");else{ALOGD("read encrypt ic the devices is not hello, so reboot");sync(); // 同步磁盘数据,将缓存数据回写到硬盘,以防数据丢失[luther.gliethttp]return reboot(RB_AUTOBOOT);}return 0;}

Android.mk 如下, licsc.a 为算法库。mm 后产生一个 i2c_write 的文件在 /system/bin/

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_PRELINK_MODULE := false
#LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SRC_FILES := i2c_command.c
# All of the shared libraries we link against.
LOCAL_SHARED_LIBRARIES := \libutils libc libcutilsLOCAL_LDFLAGS = $(LOCAL_PATH)/libsc.a
LOCAL_MODULE := i2c_write
include $(BUILD_EXECUTABLE)

以上文件编译好后,手动可以在板子上敲命令 ./i2c_write 可以查看

I/encrypt_ic( 6299): IIC read HAL: 0xff, 0x31, 0xe7, 0xd3, 0x3f, 0x4e, 0x88, 0x2a, 0xa7, 0x5b
I/encrypt_ic( 6299): is soft we get the data: 33, 0, 13, 1, 0, 111, 6, 104
D/encrypt_ic( 6299): read encrypt ic OKay & the devices is hello

---------------------------------------------------------------------------------

测试OK 后,把其功能加到系统。

由于 android 可以定制。决定在 bootanimation 通过 init.rc 这里进行判断。

代码

--- a/frameworks/base/cmds/bootanimation/bootanimation_main.cpp
+++ b/frameworks/base/cmds/bootanimation/bootanimation_main.cpp
@@ -43,6 +43,8 @@ int main(int argc, char** argv)#if defined(HAVE_PTHREADS)setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);#endif
+    ALOGE("!!!!!!!!!!!!!! Now check the ic encrypt . if the IC check fail .the system will be reboot");
+    property_set("ctl.start", "ic_encrypt");char value[PROPERTY_VALUE_MAX];property_get("debug.sf.nobootanimation", value, "0");
--- a/device/rockchip/rk3288/init.rc
+++ b/device/rockchip/rk3288/init.rc
@@ -642,3 +642,11 @@ service drawpath /system/bin/drawpathclass maindisabledoneshot
+
+
+service ic_encrypt /system/bin/i2c_write
+       class main
+       disabled
+       oneshot
+
+

编译刷机后,经验证:在没有 加密ic 或者 ic 读写出错 的机子上,机子启动不了,会不断重启

read encrypt ic the devices is not hello, so reboot

在有对应加密算法会正常重启。

log 就会看到

ead encrypt ic OKay & the devices is hello

备注:

此 i2c 用的是连续写 8个字节 和 读 10 个字节的方法

加密IC 在android 机子上的简单应用相关推荐

  1. Android github上的好的开源项目汇总

    转自:http://blog.csdn.net/ithomer/article/details/8882236 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上.基于 ...

  2. android程序如何加密软件,如何在Android手机上隐藏(加密)文件夹(软件)

    今天,我将向您展示如何在Android手机上隐藏(加密)文件夹(软件)以及如何在Android手机上隐藏(加密)文件夹(软件),以便您轻松解决问题. 在使用Android手机的过程中,出于各种原因,我 ...

  3. Android 自定义控件打造史上最简单的侧滑菜单

    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin ...

  4. Android P (4)一种绕过Android P上非SDK接口限制的简单方法

    一种绕过Android P上非SDK接口限制的简单方法 众所周知,Android P 引入了 针对非 SDK 接口(俗称为隐藏API)的使用限制.这是继 Android N上 针对 NDK 中私有库的 ...

  5. OpenGL.ES在Android上的简单实践:11-全景(索引-深度测试)

    OpenGL.ES在Android上的简单实践:11-全景(正方体-索引-深度测试) 0.全景图要怎么看? What is 全景?可能很多人单看这名字不太清楚.但看到下面的图的时候就噢的一声~瞬间廓然 ...

  6. android tls加密,加密传输才是王道!谷歌在 Android P 上默认启用 TLS

    原标题:加密传输才是王道!谷歌在 Android P 上默认启用 TLS 上周四谷歌表示,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用 ...

  7. OpenGL.ES在Android上的简单实践:10-曲棍球(拖动物体、碰撞测试)

    OpenGL.ES在Android上的简单实践:10-曲棍球(拖动物体.碰撞测试) 1.让木槌跟随手指移动 继续上一篇文章9的内容.既然可以测试木槌是否被触碰了,我们将继续努力下去:当我们来回拖动木槌 ...

  8. GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    本文转载于:https://github.com/Freelander/Android_Data/blob/master/Android-Librarys-Top-100.md 本项目主要对目前 Gi ...

  9. OpenGL.ES在Android上的简单实践:23-水印录制(FBO离屏渲染,解决透明冲突,画中画)

    OpenGL.ES在Android上的简单实践:23-水印录制(FBO离屏录制,解决透明冲突) 1.水印签名罢工了? 不知道大家有没注意到,之前我们使用MediaCodec录制的视频,水印签名那部分区 ...

最新文章

  1. 学习一段深有感悟的讲话
  2. 深度学习:卷积层的实现
  3. 简单聊聊AspNetCore的启动流程
  4. delphi random 六位_《蒙面唱将猜猜猜》第五季将播,六位唱将率先登场
  5. 【HDU - 2717】【POJ - 3278】Catch That Cow (经典bfs,类似dp)
  6. oracle10g em服务没有,如何配置和重建Oracle 10G的em服务 dbcontrol
  7. ssh整合之四单独搭建struts的运行环境
  8. IIS添加MIME类型支持 rmvb 等播放
  9. 如何在 Mac 上的“音乐”应用和 iTunes 中创建 Genius 播放列表?
  10. informix 访问mysql_Informix 11.7 使用非系统用户访问数据库
  11. SPSS因子分析案例
  12. 概率图模型之贝叶斯网络的理解与应用
  13. OPPO R7C刷机包下载_OPPO r7c原厂固件包下载地址
  14. [游戏]求生之路超级专家难度模式
  15. [联想 ThinkPad E450c 怎么进入BIOS]
  16. PPT如何锁定一些元素(使用母版的策略)
  17. [Swift]LeetCode810. 黑板异或游戏 | Chalkboard XOR Game
  18. python 函数的使用方法
  19. 为什么会有OPTIONS请求
  20. 【观展攻略】2022生物发酵展(济南),展前必读,最全观展攻略带您玩转“发酵圈”

热门文章

  1. [统计学笔记] (八)分类数据分析
  2. 磁条卡磁道笔记(2)
  3. 2023 Archlinux NVIDIA 3070 intel 双显卡驱动 + i3wm 解决方案
  4. win10系统怎么搜索xp计算机,win10安装xp系统的详细操作步骤
  5. 豆瓣9.8,它凭「少儿不宜」吊打所有美剧!脑洞大开必看神作!【内附资源】...
  6. 时间加减计算器_初级会计职称考试不让带计算器?!手把手教你使用机考系统计算器,再不看就晚了!...
  7. linux下s3c2440开发板,SAMSUNG S3C2440 ARM LINUX 开发板 上手初体验 --开发环境搭建
  8. c语言调用calculate函数,关于c语言中int calculate函数求解。谢谢
  9. 帕德逼近matlab算法,帕德逼近算法.doc
  10. NEAR官方文档翻译(三)基础(Basics)- 数据存储(Data Storage)