密钥签名代码

签名代码  时间:2021-04-30  阅读:()
1of38绪论绪论绪论绪论DallasSHAiButton(DS1963S)是一个智能令牌具有很高的安全性并支持多种服务本文简要介绍了使用SHAiButton实现数字认证和交易的应用并以一个示范服务程序为例来具体说明安装服务数据和处理电子交易的步骤本文还论述了主要API的调用方法介绍了命令注释列表和实现各种API的数据流程SHAiButton适用于多种应用批量运输电子门锁门镜控制计算机和网络访问控制电话付费停车计费器预付费表自动售货机软件授权什么是什么是什么是什么是SHASHA安全散列算法经过加密专家多年来的发展和改进已经成为公认的最安全并被广泛使用的散列算法之一在SHAiButtonDallasSemiconductor的型号为DS1963S中实现的SHA算法是SHA-1它符合联邦信息发行标准180-1即FIPS180-1杂散函数可以简单的理解为取一串输入码称为预映射或信息并把它转化为固定的较短长度的输出序列称为散列值信息摘要或信息认证代码的过程由于SHA是对压缩后的信息摘要进行检查它对检测输入序列中的错误或变化是非常有效的单向散列函数的特征是产生摘要容易但从给定的摘要反求出输入信息非常困难单向散列函数的安全性就在于其产生摘要的操作过程具有较强的单向性在输入序列中嵌入密码任何人在不知道密码的情况下都不能产生正确的摘要从而保证其安全性SHA将输入流按照每块512位64个字节分块并产生20个字节被称为信息认证代码MAC或信息摘要的输出如果输入长度不是512位算法就把它凑成最接近于512的整倍数值下图说明了由多个输入块512位产生最后的MAC的链状图应用笔记应用笔记应用笔记应用笔记157SHAiButtonAPI概述概述概述概述www.
maxim-ic.
com块NMAC块1块2SHA-1SHA-1SHA-1iButton是DallasSemiconductor的注册商标AN1572of38SHA计算器把输出MAC存入暂存器DallasSHAiButtonDS1963S中的中的中的中的SHADallasSHAiButtonDS1963S在专门的快速电路中执行SHA-1计算它可以在1ms之内完成一次SHA-1计算SHA-1引擎的输入被限制为一块通过设计SHA-1引擎的输入数据块包括存储在读/写数据页32个字节暂存器中的用户数据15个字节和服务供应商预装在不可读取的加密页中的密钥8个字节参见图1计算结果MAC保存在暂存器中用于后续操作由于对特定SHA操作的依赖性该输出MAC在通过外部访问的暂存器中不一定要隐藏起来SHAiButton中中中中MAC生成器生成器生成器生成器图1SHAiButton的特性的特性的特性的特性SHAiButton是一个只需最少硬件就能访问大约4k位读/写数据的载体通过激活集成的512位SHA-1引擎算出基于器件内存储信息的160位的信息认证代码MAC数据依照1-Wire协议串行传输该协议只需一根数据连线和一根地线每个SHAiButton利用其相应的密钥和页计数器能够同时服务于8个独立的应用中SHAiButton也可以作为协处理器保护系统密钥的安全也可以协助本地交易主机计算用户令牌认证和确认应用数据所需要的MACSHAiButton和其它iButton一样有附加的存储区域称为暂存器向存储器写数据时用作缓冲器SHAiButton的暂存器还用于向SHA-1引擎注入数据段或接收/比较信息认证代码向iButton写数据的时候数据首先被写到暂存器中在这里数据能被读回并验证是否有通信错误数据被验证之后复制暂存器命令把数据传到目标存储器位置这一过程在没有可靠的电接触环境下可以确保数据的完整性DS1963SSHAiButton有如下特殊性能4096位可读/写的非易失存储器分成16页每页256位16个存储页中的8个有独自的64位密钥和32位只读可回溯写次数计数器内置512位SHA-1引擎作为用户令牌器件能同时支持8个独立的服务可用作协处理器存储系统密钥和计算用户令牌认证确认应用数据所需要的MAC数据页(32个字节)密钥页(8个字节)暂存器(15个字节)暂存器MAC(20个字节)输入数据块SHA-11-Wire是DallasSemiconductor的注册商标AN1573of38SHAiButton存储器图存储器图存储器图存储器图通用的读通用的读通用的读通用的读/写访问数据存储器写访问数据存储器写访问数据存储器写访问数据存储器16页页页页每页每页每页每页32个字节个字节个字节个字节页码页码页码页码地址范围地址范围地址范围地址范围(TA1TA2)密钥号密钥号密钥号密钥号计数器值计数器值计数器值计数器值计数器递增计数器递增计数器递增计数器递增00000H至001FH00无10020H至003FH11无20040H至005FH22无30060H至007FH33无40080H至009FH44无500A0H至00BFH55无600C0H至00DFH66无700E0H至00FFH77无80100H至011FH00写数据时90120H至013FH11写数据时100140H至015FH22写数据时110160H至017FH33写数据时120180H至019FH44写数据时1301A0H至01BFH55写数据时1401C0H至01DFH66写数据时1501E0H至01FFH77写数据时不可读取不可读取不可读取不可读取的加密存储器的加密存储器的加密存储器的加密存储器八个八个八个八个64位密钥位密钥位密钥位密钥页码页码页码页码地址范围地址范围地址范围地址范围(TA1TA2)说明说明说明说明160200H至0207H密钥00208H至020FH密钥10210H至0217H密钥20218H至021FH密钥3170220H至0227H密钥40228H至022FH密钥50230H至0237H密钥60238H至023FH密钥7值得注意的是只有向第8到第15页写数据时页计数器才会递增在特定操作中一对匹配数据页共用一个计数器和密钥例如第0页和第8页共用0号计数器和0号密钥向第8页写数据时0号计数器增1而向第0页写数据时对0号计数器没有影响在第0页或第8页执行ReadAuthenticatedPage读鉴别页命令时都将返回0号计数器的值计算MAC都将使用密钥0AN1574of38只读计数存储器只读计数存储器只读计数存储器只读计数存储器九个九个九个九个32位计数器位计数器位计数器位计数器页码页码页码页码地址范围地址范围地址范围地址范围(TA1TA2)说明说明说明说明0260H至0263H第8页的写次数计数器0264H至0267H第9页的写次数计数器0268H至026BH第10页的写次数计数器026CH至026FH第11页的写次数计数器0270H至0273H第12页的写次数计数器0274H至0277H第13页的写次数计数器0278H至027BH第14页的写次数计数器19027CH至027FH第15页的写次数计数器0280H至0283H密钥0的写次数计数器0284H至0287H密钥1的写次数计数器0288H至028BH密钥2的写次数计数器028CH至028FH密钥3的写次数计数器0290H至0293H密钥4的写次数计数器0294H至0297H密钥5的写次数计数器0298H至029BH密钥6的写次数计数器20029CH至029FH密钥7的写次数计数器2102A0H至02A3HPRNG计数器(SHA引擎实现计数)在电子付费应用中使用在电子付费应用中使用在电子付费应用中使用在电子付费应用中使用SHAiButtonSHAiButton既可以用作用户令牌又可以用作协处理器协处理器可以完成交易会话期间的器件认证和验证应用数据所需要的MAC计算无需执行SHA计算代码有效缩短了开发周期把SHAiButton用作协处理器的另一个好处是可以把系统密钥存储在钮扣内而钮扣不能够被检测也就不会泄漏密钥在本文中我们假设SHAiButton协处理器用于本地主机执行必要的器件认证和服务数据验证本文将用到的一些术语定义如下本地主本地主本地主本地主机机机机包含必要组件的硬件单元它能利用用户SHAiButton或其它ePurse令牌完成电子交易从功能上讲本地主机包含三个关键部件交易控制单元典型的微处理器诸如显示器和令牌接收器的用户接口协处理器地址编码地址编码地址编码地址编码ANROMID注册号注册号注册号注册号序列号序列号序列号序列号可替代使用代表DS1963S或其它任何1-Wire器件内部由工厂激光刻入的全球唯一的64位码AN1575of38交易控制单元交易控制单元交易控制单元交易控制单元TCU在协处理器和用户令牌之间进行通信的组件典型的微处理器实现器件认证和服务数据验证系统认证密钥系统认证密钥系统认证密钥系统认证密钥主认证密钥主认证密钥主认证密钥主认证密钥可替代使用安装在协处理器中的密钥用于鉴别用户器件器件认证密钥器件认证密钥器件认证密钥器件认证密钥安装在用户iButton中的密钥本地主机可以验证其是否属于该系统通过绑定系统认证密钥与用户器件的地址编码保证了每个用户器件认证密钥的唯一性系统签名密钥系统签名密钥系统签名密钥系统签名密钥主签名密钥主签名密钥主签名密钥主签名密钥可替代使用代表安装在协处理器中用于签名和验证服务数据的密钥签名签名签名签名由服务数据系统签名密钥和其它服务或器件指定数据计算出的信息认证代码MAC签名通常嵌入于服务数据页中使本地主机能快速地验证服务数据器件数据器件数据器件数据器件数据用户数据用户数据用户数据用户数据应用数据应用数据应用数据应用数据账户数据账户数据账户数据账户数据交易数据交易数据交易数据交易数据代表诸如访问控制或电子付费应用的服务数据用户器件用户器件用户器件用户器件用户令牌用户令牌用户令牌用户令牌数字认证或电子付费应用中服务数据的数字载体本文凡是提到用户器件或用户令牌时都指DS1963SSHAiButton协处理器协处理器协处理器协处理器本文协处理器是一个计算单元能够完成交易过程中所必要的MAC计算服务安装服务安装服务安装服务安装为了使用器件认证和数据验证的SHAiButton必须在协处理器和用户iButton中安装适当的数据和密钥这个过程通常被称为服务初始化协处理器内装有两个密钥系统认证密钥和系统签名密钥系统认证密钥用来对每个用户器件建立唯一的认证密钥和验证用户器件是否属于该系统系统签名密钥用于产生签名和验证服务数据的有效性用户iButton内只需安装一个密钥唯一的器件认证密钥值得重视的是用户器件SHAiButton的认证密钥是唯一的它与系统认证密钥不同利用用户的器件地址作为计算器件密钥输入的组成部分服务数据有两类静态的和动态的静态服务数据在交易期间从不发生改变而动态服务数据在每次交易的过程中总是进行更新比如用于办公室或饭店的访问控制的服务数据含有定时的访问特权信息这些数据需要进行验证但同步处理器本地主机不对它进行修改另一方面自动售货机或停车计费器则需要从账户借记适当的金额并对减少后的余额数进行再次数字签名使其能够被其它本地主机加以验证如果系统只是要知道一个用户器件是否属于该系统经授权的用户而不必根据服务数据的内容确定是否交易就不必保护服务数据AN1576of38总的说来电子付费系统包含以下步骤对于服务安装1把系统认证密钥安装到SHAiButton协处理器2把系统签名密钥安装到SHAiButton协处理器如果需要数据保护对于每个用户器件3把用户器件认证密钥安装到用户SHAiButton4把有签名的服务数据安装到用户SHAiButton如果需要数据保护对于处理交易5使用SHAiButton协处理器完成用户器件认证6使用SHAiButton协处理器完成用户数据验证如果需要数据保护器件认证器件认证器件认证器件认证为了认证用户SHAiButtonTCU会请求协处理器计算一个随机质询1并将其送回用户iButton请求它利用ReadAuthenticatedPage命令计算应答MAC用户iButton利用质询服务数据自身的地址编码及其认证密钥计算应答MAC然后本地主机读取该应答MAC并与它随后的计算进行比较为了验证应答MACTCU会请求协处理器利用用户器件地址编码和系统认证密钥首先重新计算用户iButton唯一的器件认证密钥随后TCU请求协处理器利用重新计算的器件认证密钥和发送给用户iButton的质询码计算MAC协处理器计算出的MAC再和从用户iButton读取的应答MAC进行比较以确定用户器件是否合法这两步处理过程是必要的因为本地主机不能读取用户器件的密钥而且用户器件认证密钥与系统认证密钥不同值得注意的是器件认证只需要用户器件携带有正确的认证密钥并不关心服务数据的内容服务数据保护服务数据保护服务数据保护服务数据保护服务数据保护可以通过嵌入系统产生的服务数据MAC签名实现利用系统签名密钥服务数据服务数据页码页计数值和用户器件地址编码产生签名利用签名可以检测出任何未经授权的变动防止重放服务数据为了验证服务数据TCU会令协处理器用系统签名密钥和所有运行期间获得的服务用户器件数据重新计算MAC签名然后MAC将与嵌入的签名进行比较以确定数据的有效性对于动态数据服务而言服务数据更新后将计算一个新的签名来反映数据变更和新的页计数值这个新的签名将嵌入到服务数据并保存到用户器件中1该质询从某中意义上讲是动态的是因为它受SHA引擎计数值的影响每次运行SHA引擎计数器都会递增而且用户iButton不可能收到同一质询两次关于产生质询和密钥更详细的资料参见AN152AN1577of38静态数据服务静态数据服务静态数据服务静态数据服务静态数据服务只需进行器件认证和服务数据验证以便做出服务的决定器件认证代表验证用户器件是否属于系统的过程器件认证在特定的访问控制应用中也许是唯一需要的手续实现器件认证的方法多种多样a读取器件的地址编码AN搜索数据库查看其是否属于系统b执行一次质询和应答过程检测器件是否带有有效密钥c其它方法SHAiButton用第二种方法认证器件在这种质询与应答方法中本地主机请求用户器件根据其隐藏的认证密钥与密钥相链接的存储数据和本地主机提供的质询码计算一个应答MAC用户器件从不向外泄漏它的密钥这种认证机制使得系统非常安全尤其是在本地主机与用户器件之间的通信链路不安全的情况下更有益此外对于用户器件的每次服务请求本地主机都发出不同的质询使每次应答MAC均不相同这就使得截取的通信数据位毫无用途完成静态数据服务的典型步骤如下参见图21从用户iButton读取地址编码AN2如果不是SHAiButton则转到其它决定过程3通过质询和应答过程认证用户iButton如果用户iButton不属于系统则退出4需要验证服务数据吗如果不需要则提供服务5核对服务数据是否有效无效则退出6提供服务静态数据服务判定树静态数据服务判定树静态数据服务判定树静态数据服务判定树图2否授权否否是是是否需要验证数据吗执行服务数据验证数据有效吗是SHAiButton从用户iButton读取地址编码认证用户SHAiButton属于系统吗拒绝AN1578of38动态数据服务动态数据服务动态数据服务动态数据服务除了在执行静态数据服务时的认证和数据验证外利用动态数据的服务还需要额外的步骤来更改服务数据重新建立签名和把重新签名的数据保存到用户iButton典型步骤概括如下1从用户iButton读取地址编码AN2如果不是SHAiButton则转到其它决定过程3通过质询和应答过程认证用户SHAiButton如果用户SHAiButton不属于系统则退出4服务数据是否允许提供被请求的服务不允许则退出5执行服务数据验证如果无效则退出6更改服务数据并建立新的签名7把有签名的新服务数据存储到用户iButton8再次执行用户器件认证以确保用户器件中的原始服务数据被更新9提供服务动态数据服务判定树动态数据服务判定树动态数据服务判定树动态数据服务判定树图3是是否是SHAiButton是是服务数据有效吗授权服务建立新的服务数据签名执行服务数据验证否把更新的服务数据和签名保存到用户iButton否否否从用户iButton读取地址编码认证用户SHAiButton属于系统吗数据允许被请求的服务吗停止鉴别用户iButton并再次验证服务数据有效否AN1579of38寄主多重服务寄主多重服务寄主多重服务寄主多重服务可以利用1-WireFileStructureOWFS2来促成一个用户iButton中共存多重服务每种服务数据存储在自身的服务文件中为便于存取多个文件按照目录表排列本地主机在目录列表中为一次服务读取文件入口地址获取实际页的位置和用于服务的页数实际服务数据取自服务文件特殊的文件可以存储在协处理器和其它iButton中把它们当作特殊器件进行验证例如我们在SHAiButton中建立了一个名为COPR.
0的文件并把它当作协处理器进行验证而且把完成一次交易的TCU所必须的全部数据存于该文件中我们可以在iButton中建立另一个名为COLL.
102的文件把它作为移动数据收集器进行验证移动数据收集器有权从本地主机获得数据随后转储到中央数据库中当交易控制单元TCU开始工作的时候它从协处理器iButton读取信息准备处理交易当TCU检测到有数据集合器与其连接时将执行必要的验证输出被请求的数据协处理器文件协处理器文件协处理器文件协处理器文件向DS1963SSHAiButton中安装适当的系统密钥和数据可将其配制成协处理器对于没有数据验证的静态数据服务协处理器中只安装了系统认证密钥而动态数据服务或者需要数据验证的静态数据服务则必须在协处理器中安装系统认证密钥和系统签名密钥协处理器也能执行认证用户iButton和验证服务数据所必须的全部MAC计算在我们的示范中在SHAiButton中建立了一个充当协处理器的协处理器文件COPR.
0COPR.
0包含了交易控制单元为处理交易所必须的全部数据协处理器文件数据结构协处理器文件数据结构协处理器文件数据结构协处理器文件数据结构3表1协处理器文件协处理器文件协处理器文件协处理器文件COPR.
0的结构的结构的结构的结构字节数抽样资料备注服务数据文件名5DLSM.
102只保存基本名(DLSM)和扩展名而不保存分隔符.
扩展字节按照十六进制数保存66H=102d签名页码18合法的选择是第0页或第8页第0页用做文件目录表认证页码17从足够高的页码开始为存储文件留出足够的页工作空间页码19在交易过程中是协处理器建立用户器件唯一的认证密钥所必需的21-WireFileStructureOWFS为驻留在包括iButton在内的1-Wire器件中的数据提供目录结构当它们在其它文件系统允许随机访问命名后的文件按照OWFS的定义和规则利用容量达16M字节的器件足以存储嵌套目录中的多重文件这些器件被组织为2…65535页每页32…256个字节关于OWFS结构和配套支持的详细信息参见DallasSemiconductor/Maxim应用笔记1143在执行服务的示范中所有的数据字节按照最低有效位在前写入AN15710of38协处理器文件协处理器文件协处理器文件协处理器文件COPR.
0的结构的结构的结构的结构版本号11服务供应商利用版本号跟踪服务配置的变化安装数据代码4040E0063H安装代码按照MDYY格式存储YY=1900年以后的年份比如4/14/1999=040E0063器件认证密钥绑定数据3939FFH字节服务供应商用它将认证密钥绑定到用户SHAiButton该数据块的前32个字节写到数据页剩下的7个字节在计算器件认证密钥时写到暂存器中暂存器实际上包括15个输入到SHA引擎的字节其余8个字节是页码1个字节和不带有CRC校验字节的器件地址编码服务签名代码3300H字节该数据是写到暂存器中用来建立服务数据签名的15个字节的一部分其余的12个字节是页码1个字节页计数值4个字节和不带有CRC校验码的器件地址编码7个字节Providernamelength(svcNameLen)120服务供应商名字的长度可调节Signaturelength(signLen)120用户账务页中签名块的长度这个值可以缩短以便为其它数据辅助数据留出空间Auxiliarydatalength(auxDataLen)10辅助数据块的长度可调长度为零意味着没有附加数据服务提供者的名字20DallasSemiconductor服务供应商的名字或说明它的长度受Providernamelength限制签名初始值202000H字节初始数据块的长度必须与上述Signaturelength匹配这些字节被置位替代用户数据页的签名块以建立数据签名辅助数据0辅助数据的长度必须与上述Auxiliarydatalength匹配加密算法代码10用来说明为保护文件内容所采用的加密或者编码机制类型的标志DS1961S标志10一个用于说明为协处理器安装密钥是否作了适当截取以便配合DS1961S使用的布尔标记字节总数字节总数字节总数字节总数100AN15711of38值得注意的是COPR.
0的长度随三个长度参数的不同而不同这三个参数是ProviderNameLengthSignatureLength和AuxiliaryDataLength提供这些参数是为了允许提供附加的定制性能这些性能是软件支持的但需要由COPR.
0文件中的数据激活服务数据文件服务数据文件服务数据文件服务数据文件在应用的示范中我们在每个用户SHAiButton中都建立了一个服务文件DLSM.
102并把它作为用户iButton识别文件DLSM.
102包含如下数据服务文件数据结构服务文件数据结构服务文件数据结构服务文件数据结构表2服务文件服务文件服务文件服务文件DLSM.
102的结构的结构的结构的结构字节数抽样数据备注数据类型码10该域可用于进一步说明交易数据的类型例如0表示动态数据1表示静态数据等等服务数据签名20[计算值]由本地主机计算乘法器/转换系数28B48H该数据可以用来把一个数值转换为另一个数值在本服务示范中我们安装了美元的国际流通代码和从美分转换为美元的转换系数0.
01特殊格式通常由服务确定账目余额30186A0H100000分$1000交易ID21234H交易ID可以将更多的参考数据与交易链接到一起字节总数字节总数字节总数字节总数28值得注意的是文件内容有28个字节但实际要以下面的格式存储32个字节更多的信息参见AN114文件长度(1字节)文件内容(28字节)文件延续指针(1字节)CRC-16(2字节)本地主机检测用户SHAiButton时它从用户SHAiButton的目录列表中读取文件DLSM.
102的页码在我们的服务示范中是13使用与第13页相关的密钥密钥为5进行器件认证AN15712of38安装服务数据安装服务数据安装服务数据安装服务数据在处理任何交易之前必须把适当的服务数据和密钥安装到协处理器和用户iButton中也可以看作是器件的初始化过程静态和动态数据服务都需要器件认证如果服务采用动态数据如电子付费应用需要在每次交易中验证和更新服务数据协处理器将包含两个系统密钥一个用于认证另一个用于验证服务数据并对服务数据再次签名除非系统签名密钥一定安装到0号密钥中安装两个系统密钥的步骤是相同的通常使用不同的输入数据片断计算在用户器件端通过在服务数据页嵌入一个由服务数据和系统签名密钥计算产生的签名可以保护服务数据把服务安装到协处理器和用户SHAiButton中的基本步骤如下所述以下给出了详细的说明对不需要数据验证的服务1把系统认证密钥安装到协处理器中2通过将系统认证密钥绑定到用户iButton地址编码和服务数据页码在用户iButton中安装一个唯一的器件认证密钥3向用户iButton写服务数据如果需要的话对需要数据验证的服务1把系统认证密钥安装到协处理器中2把系统签名密钥安装到协处理器中3通过将系统认证密钥绑定到用户iButton地址编码和服务数据页码在用户iButton中安装一个唯一的器件认证密钥4利用系统签名密钥服务数据服务数据的页码和写次数计数值以及用户器件地址编码计算签名5在服务数据中嵌入签名并把它写入用户iButtonSHAiButton中密钥的产生中密钥的产生中密钥的产生中密钥的产生把密钥安装到SHAiButton中需要把数据片断更多的信息参见AN152写到指定页和暂存器用数据计算MAC把选定的MAC字节复制到目标密钥内参见图4不要直接写入密钥通过片内SHA引擎产生的密钥允许几个用户共同参与密钥的安装过程称为密钥分摊如果没有其它用户的参与任何单个用户都不能再生系统密钥这个过程有效地减小了密钥泄漏的风险从N个片断partials[k]k=0至N-1产生系统密钥的流程参见图5每次迭代计算MAC时利用两个数据源47个输入数据字节其中32个字节写入数据页15个字节写入暂存器和密钥的当前内容8个字节密钥用下次迭代之前刚刚计算出的新的MAC进行更新循环的初始k=0密钥设置为一个空值因为每一次迭代都为下一次计算产生一个新的密钥所以最后的系统密钥是上述所有输入片断的函数除系统签名密钥必须安装到协处理器的0号密钥即cSignSecretNum=0以外上述流程对系统鉴别密钥和系统签名密钥的计算同样适用执行通用函数installSystemSecret可以把来自多个片断的系统密钥安装到SHAiButton中详细内容见第0章AN15713of38SHAiButton中产生的密钥中产生的密钥中产生的密钥中产生的密钥图4使用密钥共享产生系统密钥使用密钥共享产生系统密钥使用密钥共享产生系统密钥使用密钥共享产生系统密钥图5服务示范服务示范服务示范服务示范我们的服务示范是将账目余额计入借方的一次电子付费服务每次交易都要重新签名值得注意的是器件认证不仅要验证服务数据页而且还包括与用户iButton中服务数据页有关的器件认证密钥对于服务数据签名系统的一般签名密钥存在协处理器中而不是存在用户iButton中因此我们可以只用一个数据页和一个密钥来控制电子付费应用服务数据页和与之相匹配的器件认证密钥本服务示范中用到的符号和变量概述如下以供参考值得注意的是在多服务寄主器件中每个用户iButton的服务数据页码即uSignDataPage和认证密钥号uAuthSecretNum可以不同SHA计算(ComputeFirstSecret或ComputeNextSecret命令)完成后20个MAC字节中的8个置于暂存器中这样通过CopyScratchpad命令可以把它复制到密钥页数据页32个字节暂存器15个字节密钥8个字节暂存器SHA-1SHA-1数据页partial[k]的32个字节暂存器partial[k]的15个字节密钥S[k]noteS[0]=0用到的命令ComputeFirstSecret,k=0ComputeNextSecret,k>0CopyScratchpad下一次迭代开始前利用SHA计算完成后产生的放置在暂存器中的局部MAC结果更新密钥页暂存器MACk从0循环到N-1循环结束AN15714of38在用户SHAiButton中用到的页如下协处理器SHAiButton中用到的页如下变量和数值列表变量和数值列表变量和数值列表变量和数值列表表3变量列表变量列表变量列表变量列表变量变量变量变量服务示范取值服务示范取值服务示范取值服务示范取值说明说明说明说明cAN协处理器iButton地址编码uAN用户iButton地址编码cAuthDataPage7系统认证数据页在协处理器中cAuthSecretNum7系统认证密钥号在协处理器中cSignDataPage8系统签名数据页在协处理器中cSignSecretNum0系统签名密钥号在协处理器中uAuthDataPage13用户器件认证数据页uAuthSecretNum5用户器件认证密钥号uSignDataPage13用户iButton中的服务数据页码svcNameDallasSemiconductor器件供应商的名字需要的时候在右侧填补字节00H数据页13密钥5用户iButton配置服务数据页(uSignDataPage=13)器件认证密钥(uAuthSecretNum=5)协处理器iButton配置系统认证密钥(cAuthSecretNum=7)系统签名密钥(cSignSecretNum=0)工作空间密钥(wkSecretNum=1)协处理器iButton配置系统认证数据页(cAuthDataPage=7)系统签名数据页(cSignDataPage=8)工作空间数据页(wkDataPage=9)数据页8密钥0数据页7密钥7数据页9密钥1AN15715of38变量列表变量列表变量列表变量列表变量变量变量变量服务示范取值服务示范取值服务示范取值服务示范取值说明说明说明说明nAuthPartials1计算系统认证密钥的片断的数量nSignPartials1计算系统签名密钥的片断的数量authPartial[j]j=0至nAuthPartials-147FFH字节计算系统认证密钥的片断每个矩阵元素中有47个字节其中32个字节写到数据页中另外15个字节写到暂存器中signPartial[j]j=0至nSignPartials-147FFH字节计算系统签名密钥的片断每个矩阵元素中有47个字节其中32个字节写到数据页中另15个字节写到暂存器中authBind3900H字节器件认证密钥的绑定数据39个字节的数据块用于把系统认证密钥绑定到用户器件前32个字节写入数据页剩下的7个字节写入暂存器以计算器件认证密钥signCode300H字节用于产生服务数据签名的3个字节代码signInitial2000H字节计算服务数据签名的初始值uData服务数据页内容TA1,TA2,ES器件地址和状态寄存器uSignDataPageWCC服务数据页的写次数计数在用户iButton中(=uAuthDataPageWCC)cFileNameCOPR.
0协处理器文件名存储在协处理器中uFileNameDLSM.
102服务文件名存储在用户iButton中wkDataPage9协处理器中工作空间数据页码wkSecretNum1工作空间密钥号在协处理器中在协处理器中安装系统认证密钥在协处理器中安装系统认证密钥在协处理器中安装系统认证密钥在协处理器中安装系统认证密钥下面列出了在SHAiButton中安装系统鉴别密钥的命令时序和数据流执行API函数installSystemSecret的细节问题见附录AAN15716of38在协处理器中安装系统鉴别密钥在协处理器中安装系统鉴别密钥在协处理器中安装系统鉴别密钥在协处理器中安装系统鉴别密钥图6为了在协处理器中安装系统认证密钥要用到APIs=installSystemSecret(cAN,cAuthDataPage,cAuthSecretNum,nAuthPartials,authPartial)s=eraseDataPage(cAN,cAuthDataPage)调用eraseDataPage具体实现在第0节将删除最后一个写到协处理器中的片断防止其泄漏请注意为简单起见本文的API调用列表忽略了所有的误码校验和重复迭代在实际应用中每次调用返回的状态都应进行误码校验并进行适当的重复迭代例如在协处理器中安装具有适当误码校验和重试功能的系统认证密钥的程序类似于以下代码//iterationcountlimitloopLimit=5在协处理器中安装系统认证密钥k从0循环到nAuthPartials-1把authPartial[k]的32个字节写到暂存器中[WriteScratchpad]把暂存器中的数据复制到cAuthDataPage页[CopyScratchpad]n把authPartial[k]的其余15个字节写到暂存器[WriteScratchpad]计算密钥MAC置于暂存器中[ComputeFirstSecret]如果k=0[ComputeNextSecret]如果k>0向暂存器写入空字节准备复制密钥使用目标密钥地址[WriteScratchpad]从暂存器把密钥复制到cAuthSecretPage密钥[CopyScratchpad]结束循环协处理器系统认证密钥被安装到协处理器cAuthSecretNum(=7)的密钥中片断被写到cAuthDataPage(=7)页和暂存器用于计算密钥pnon数据页7SHA-1密钥7authPartial[k][0:31]暂存器authPartial[k][32:46]opAN15717of38s=1loop=0dowhile(loop0)//thecallreturns0ifnoerrors=installSystemSecret(cAN,cAuthDataPage,cAuthSecretNum,nAuthPartials,authPartial)loop=loop+1endloop//quitifwestillhaveerrorsafterpresetnumberoftriesif(s0)thenexitendifs=1loop=0dowhile(loop0)//thecallreturns0ifnoerrors=eraseDataPage(cAN,cAuthDataPage)loop=loop+1endloop//quitifwestillhaveerrorsafterpresetnumberofiterationsif(s0)thenexitendif…continue…在协处理器中安装系统签名密钥在协处理器中安装系统签名密钥在协处理器中安装系统签名密钥在协处理器中安装系统签名密钥在SHAiButton中安装系统签名密钥的命令时序和数据流与安装系统认证密钥的过程一样只是片断目标数据页和目标密钥系统签名密钥必须装到密钥0中不同为了在协处理器中安装系统签名密钥用到了APIs=installSystemSecret(cAN,cSignDataPage,cSignSecretNum,nSignPartials,signPartial)s=eraseDataPage(cAN,cSignDataPage)协处理器系统签名密钥安装到协处理器的cSignSecretNum(=0)密钥中片断写到cSignDataPage(=8)页和暂存器中用来计算密钥数据页8暂存器SHA-1密钥0AN15718of38值得注意的是系统签名密钥必须安装到密钥0cSignSecretNum=0中与它相匹配的数据页cSignDataPage或者是0或者是8在我们的服务示范中第0页用作OWFS目录所以我们用cSignDataPage=8在用户在用户在用户在用户iButton中安装器件认证密钥中安装器件认证密钥中安装器件认证密钥中安装器件认证密钥为了安装用户iButton的器件认证密钥首先要把系统认证密钥安装到用户iButton中secretAuthSystem然后由系统绑定数据bindData系统认证密钥secretAuthSystem服务数据页码uSignDataPage和用户iButton的地址编码uAN计算出唯一的器件密钥用户iButton的地址编码使得器件认证密钥对iButton来说是唯一的下面列出了这两个步骤第二步执行了详细内容见第0节一个APIbindSecretToiButton绑定器件和服务数据以产生器件认证密钥绑定器件和服务数据以产生器件认证密钥绑定器件和服务数据以产生器件认证密钥绑定器件和服务数据以产生器件认证密钥用户iButtonAuthSecret步骤1系统认证密钥(secretAuthSystem)安装到用户iButton的密钥中uAuthSecretNum(=5)片断写到uAuthDataPage(=13)页和暂存器用来计算密钥数据页13暂存器SHA-1密钥5用户iButtonAuthSecret步骤2通过绑定系统认证密钥(secretAuthSystem)与服务和用户iButton特定数据(uAuthDataPage,uAN)把器件认证密钥(secretAuthDevice)安装在用户iButton的密钥uAuthSecretNum(=5)中数据页13暂存器SHA-1密钥5nopqbindData[0:31]pad_bindAN15719of38截取绑定数据暂存器中的服务和用户器件数据可用来计算唯一的器件认证密钥pad_bind偏移位置0:78:1112:1213:1920:2223:31字节数8个字节4个字节1个字节7个字节3个字节9个字节数据00HbindData[32:35]uAuthDataPageuAN[0:6]bindData[36:38]00H为了安装器件认证密钥使用的APIs=installSystemSecret(uAN,uAuthDataPage,uAuthSecretNum,nAuthPartials,authPartial)s=bindSecretToiButton(uAN,uAuthDataPage,uAuthSecretNum,bindData,uAuthDataPage,uAN)s=eraseDataPage(uAN,uAuthDataPage)在用户iButton中安装系统认证密钥k从0循环到nAuthPartials-1把authPartial[k]的前32个字节写到暂存器[WriteScratchpad]把数据从暂存器复制到页uAuthDataPage[CopyScratchpad]把authPartial[k]的其余15个字节写到暂存器[WriteScratchpad]计算密钥结果MAC置于暂存器中如果k=0[ComputeFirstSecret]如果k>0[ComputeNextSecret]使用目的密钥地址向暂存器写入空字节准备复制密钥[WriteScratchpad]把密钥从暂存器复制到密钥uAuthSecretNum[CopyScratchpad]结束循环绑定器件和服务数据以产生唯一的器件认证密钥把bindData的前32个字节写入暂存器[WriteScratchpad]把数据从暂存器复制到uAuthDataPage页[CopyScratchpad]将截取后的绑定数据pad_bind写入暂存器[WriteScratchpad]该数据由bindData鉴别数据页码uAuthDataPage用户iButton地址编码uAN无CRC校验码的后7个字节组成计算密钥[ComputeNextSecret]结果MAC放置到暂存器中使用目标密钥地址向暂存器写入空字节准备复制密钥[WriteScratchpad]把密钥从暂存器复制到密钥uAuthSecretNum[CopyScratchpad]nopqAN15720of38在协处理器中创建服务数据签名在协处理器中创建服务数据签名在协处理器中创建服务数据签名在协处理器中创建服务数据签名服务数据签名是根据服务数据和系统签名密钥计算产生的签名可以嵌入4到服务数据页在每次交易过程中由本地主机进行验证例如在我们的服务示范中我们把签名嵌入如下服务数据页OWFS需要数据块长度后续指针和CRC-16校验字节在服务数据页嵌入数据签名在服务数据页嵌入数据签名在服务数据页嵌入数据签名在服务数据页嵌入数据签名偏移位置0:01:12:2122:2324:2627:2829:2930:31字节数1个字节1个字节20个字节个字节个字节个字节2个字节3个字节2个字节1个字节2个字节数据长度值数据类型签名签名签名签名转换系数账务余额传输ID后续指针CRC-16因为签名占据了服务数据页的一部分所以为了计算签名签名数据块必须初始化为一些已知值signInitial5注意为了防止服务数据建立金额被非法复制和再利用应该用诸如器件地址编码uAN服务数据页的页码uSignDataPage和写次数计数值uSignDataPageWCC等器件的特殊数据作为输入进行签名计算如果禁止复制服务数据把服务数据安装到具有写次数计数器的页中也很重要该计数器在每次写操作时都会递增产生服务数据签名的过程是在APIcreateDataSignature中实现的详细内容见第0节//createsignature,thepasseduData_inihasthesignatureblockinitializedtosignInitialsig=createDataSignature(cAN,cSignDataPage,cSignSecretNum,uData_ini,signCode,uAN,uSignDataPage,uSignDataPageWCC)被截取的签名数据块被截取的签名数据块被截取的签名数据块被截取的签名数据块pad_signCode偏移量0:78:1112:1819:1920:2223:31字节数填补8个字节4个字节7个字节1个字节3个字节填补9个字节数据8个00H字节uSignDataPageWCC+16uAN[0:7]uSignDataPagesignCode9个00H字节4注意签名还没有嵌入到服务数据页它可以存储到单独的页中这样可留出32个字节空间存储原始的服务数据5如果签名没被嵌入到32个字节的服务数据页中就不必进行初始化sig=createDataSignature(cAN,cSignDataPage,cSignSecretNum,uData,signCode,uAN,uSignDataPage,uSignDataPageWCC)6已签名的服务数据写入到服务数据页后WCC+1就成为其新的写次数计数值因为每次向页中写入数据写次数计数器的值都会增1在第8到15页AN15721of38在协处理器中产生服务数据签名将uData_ini写入暂存器[WriteScratchpad]将数据从暂存器复制到页cSignDataPage[CopyScratchpad]将截取后的签名数据(pad_signCode)写入暂存器[WriteScratchpad]该数据由signCodeuSignDataPageWCCuAN无CRC校验码和uSignDataPage组成计算签名[SignDataPage]计算出的MAC置于暂存器从暂存器读取签名MAC[ReadScratchpad]noqp协处理器服务数据签名根据以下数据计算而来初始化的服务数据(uData_ini)系统签名密钥(cSignSecretNum=0时)系统签名代码(signCode)用户iButton地址编码uAN(无CRC校验码)服务数据页码(uSignDataPage)和它的写次数计数值(uSignDataPageWCC)数据页8暂存器SHA-1密钥0qpon已被截取的签名数据块已初始化的服务数据AN15722of38服务安装摘要服务安装摘要服务安装摘要服务安装摘要安装服务的主API调用概述如下无数据验证的静态数据服务无数据验证的静态数据服务无数据验证的静态数据服务无数据验证的静态数据服务将服务数据安装到协处理器将服务数据安装到协处理器将服务数据安装到协处理器将服务数据安装到协处理器//installthesystemauthenticationsecretintothecoprocessors=installSystemSecret(cAN,cAuthDataPage,cAuthSecretNum,nAuthPartials,authPartial)//erasethepartialphrasesoitisnotaccidentallyexposeds=eraseDataPage(cAN,cAuthDataPage)将服务数据安装到用户将服务数据安装到用户将服务数据安装到用户将服务数据安装到用户iButton//installthesystemauthenticationsecretintotheuseriButtons=installSystemSecret(uAN,uAuthDataPage,uAuthSecretNum,nAuthPartials,authPartial)//bindservicedata,userdeviceIDwithsystemsecrettocreateauniquedeviceauthsecrets=bindSecretToiButton(uAN,uAuthDataPage,uAuthSecretNum,bindData,uAuthDataPage,uAN)s=eraseDataPage(uAN,uAuthDataPage)//erasethebindingdatafromthedatapage有数据验证的服务有数据验证的服务有数据验证的服务有数据验证的服务将服务数据安装到协处理器将服务数据安装到协处理器将服务数据安装到协处理器将服务数据安装到协处理器//installthesystemauthenticationsecretintothecoprocessors=installSystemSecret(cAN,cAuthDataPage,cAuthSecretNum,nAuthPartials,authPartial)//installthesystemsigningsecretintothecoprocessors=installSystemSecret(cAN,cSignDataPage,cSignSecretNum,nSignPartials,signPartial)s=eraseDataPage(cAN,cSignDataPage)//erasethepartialphrasesoitisnotaccidentallyexposeds=eraseDataPage(cAN,cAuthDataPage)将服务数据安装到用户将服务数据安装到用户将服务数据安装到用户将服务数据安装到用户iButton//installthesystemauthenticationsecretintotheuseriButtons=installSystemSecret(uAN,uAuthDataPage,uAuthSecretNum,nAuthPartials,authPartial)//bindservicedata,userdeviceIDwithsystemsecrettocreateauniquedeviceauthsecrets=bindSecretToiButton(uAN,uAuthDataPage,uAuthSecretNum,bindData,uAuthDataPage,uAN)//createtheservicedatasignatureincoprocessorsig=createDataSignature(cAN,cSignDataPage,cSignSecretNum,uData_ini,signCode,uAN,uSignDataPage,uSignDataPageWCC)//embedthesignatureinservicedatapagesData=…//writetheservicedatawiththeembeddedsignaturetouseriButtons=writeDataPage(uAN,uSignDataPage,sData)AN15723of38处理交易处理交易处理交易处理交易用SHAiButton处理交易可以分成两步本地主机认证用户SHAiButton和更新服务数据本地主机含三个逻辑组件协处理器交易控制单元TCU和诸如显示器令牌接受器及服务分配器的用户接口TCU可以是个人计算机或微控制器重要的是协处理器和包括密钥保密信息在内的其它单元要放置在适当的安全区域保证它们在物理上和电器上的安全性认证用户认证用户认证用户认证用户iButton图7说明了用户SHAiButton的认证过程在API中的说明如下challenge=createChallenge(cAN,cAuthDataPage)//computeachallengeinthecoprocessor//challengetheuseriButtonforanauthenticationresponse//theAPIcallreturnstheservicepagedata,pagecounter,andtheresponseMAC//uData=uResp[0:31];uSignDataPageWCC=uResp[32:35];uMAC=uResp[36:55]uResp=answerChallenge(uAN,uAuthDataPage,challenge)//recreateuseriButton'sdeviceauthenticationsecretincoprocessors=bindSecretToiButton(cAN,cAuthDataPage,wkSecretNum,bindData,uAuthDataPage,uAN)//verifytheresponseMACinthecoprocessors=verifyAuthResponse(cAN,wkDataPage,uData,uAN,uAuthDataPage,uSignDataPageWCC,challenge,uMAC)AN15724of38用户用户用户用户SHAiButton的的的的认证过程认证过程认证过程认证过程图7截取的绑定数据块截取的绑定数据块截取的绑定数据块截取的绑定数据块pad_bind8个字节4个字节1个字节7个字节3个字节9个字节8个00H字节bindData[32:35]uAuthDataPageuAN[0:6]bindData[36:38]9个00H字节截取的质询数据块截取的质询数据块截取的质询数据块截取的质询数据块pad_challenge填补8个字节4个字节1个字节7个字节3个字节填补9个字节8个00H字节uAuthDataPageWCCuAuthDataPageuAN[0:6]challenge9个00H字节在协处理器中产生随机质询在协处理器中产生随机质询在协处理器中产生随机质询在协处理器中产生随机质询为了在协处理器中产生一个随机质询TCU会令协处理器执行一次ComputeChallenge操作该命令完成后TCU可利用SHA引擎放置在暂存器中的20个MAC字节的任意3个字节调用的API函数如下具体执行细节见附录Achallenge=createChallenge(cAN,cAuthDataPage)在协处理器iButton中验证用户iButton的认证响应在协处理器的工作空间wkSecretNum密钥中重建用户iButton的认证密钥将bindData的32个字节写入暂存器[WriteScratchpad]复制数据到页cAuthDataPage[CopyScratchpad]将截取后的由bindData,uANuAuthDataPageuAuthDataPageWCC组成的7个字节的绑定数据(pad_bind)写入暂存器[WriteScratchpad]计算器件密钥[ComputeNextSecret]用目标密钥地址向暂存器写入空字节准备复制密钥复制密钥到密钥号wkSecretNum[CopyScratchpad]计算认证MAC将uData写入暂存器[WriteScratchpad]复制uData到页wkDataPage[CopyScratchpad]将填充后的质询字段(pad_challenge)写入暂存器[WriteScratchpad]计算MAC[ValidateDataPage]将此MAC与uMAC进行比较[MatchScratchpad]如果两者相同则用户iButton是合法的在协处理器中产生随机质询利用cAuthDataPage页在协处理器中产生随机质询[ComputeChallenge]从协处理器读取质询(=challenge)[ReadScratchpad]在用户iButton中质询用户iButton以得到认证应答将challenge写入用户iButton的暂存器[WriteScratchpad]在用户iButton中用页uAuthDataPage产生响应MAC[ReadAuthenticatedPage]该命令也返回服务数据页计数值(uSignDataPageWCC)和服务数据(uData)注意uAuthDataPage=uSignDataPage读取用户iButton的地址编码(uAN)认证响应MAC(uMAC)[ReadROM,ReadScratchpad]AN15725of38质询用户质询用户质询用户质询用户iButton以得到认证应答以得到认证应答以得到认证应答以得到认证应答TCU向用户iButton发出质询challenge令其基于质询写到暂存器中偏移量为20到22的单元和它的器件认证密钥计算应答MAC实现的API见附录AuResp=answerChallenge(uAN,uAuthDataPage,challenge)返回的uResp含有服务数据uData页写次数计数器uAuthDataPageWCC和应答MACuMACuData=uResp[0:31]uAuthDataPageWCC=uResp[32:35]uMAC=uResp[36:55]验证用户验证用户验证用户验证用户iButton的认证应答的认证应答的认证应答的认证应答为了验证用户iButton的响应必须首先在协处理器中再生用户iButton的器件认证密钥值得注意的是TCU不能读取这个再生的认证密钥而且它也不需要去读取认证不能通过直接比较认证密钥来实现而是比较SHA根据认证密钥其它服务和器件的特殊数据计算的结果在协处理器中再生用户认证密钥后执行ValidateDataPage命令计算授权MAC用于比较协处理器把它的计算结果cMAC存入外界不可读取的暂存器中用MatchScratchpad命令比较从用户iButtonuMAC中读出的数值与协处理器暂存器中的cMAC认证过程的第一步是在协处理器中再生用户器件的认证密钥它在服务安装过程中与在用户iButton中安装器件认证密钥一样只是这个认证过程的目标器件是协处理器目标密钥安装到协处理器未用过的密钥编号区内认证的第二步是执行用户iButton的应答MACuMAC见附录A//recreateuserdevice'suniqueauthenticationsecretincoprocessor–toanunused//secretnumber(wkSecretNum)s=bindSecretToiButton(cAN,cAuthDataPage,wkSecretNum,bindData,uAuthDataPage,uAN)//verifytheuserdevice'sresponseMACincoprocessors=verifyAuthResponse(cAN,wkDataPage,uData,uAN,uAuthDataPage,uAuthDataPageWCC,challenge,uMAC)验证嵌入的服务数据签名验证嵌入的服务数据签名验证嵌入的服务数据签名验证嵌入的服务数据签名通过核对嵌入的签名sign验证服务数据页首先服务数据页的签名要被置为已知的初始值signInitial在协处理器中重新计算签名cSign然后TCU比较sign与cSign如果二者一样则服务数据是有效的注意在我们认证用户iButton时已经取得了服务数据服务数据页的写次数计数值为了在协处理器中重建签名首先要保存签名sign然后用signInitial初始化uData签名数据以恢复产生签名的原始数据块uData_ini然后我们利用用户器件和服务参数地址编码服务页码和计数值来重建签名AN15726of38cSign=createDataSignature(cAN,cSignPage,cSignSecretNum,uData_ini,signCode,uSignDataPage,uAN,uSignDataPageWCC-1)重新在更新的服务数据上签名重新在更新的服务数据上签名重新在更新的服务数据上签名重新在更新的服务数据上签名在动态数据服务中服务数据被更新计算一个新的签名用于服务数据的重新签名这个过程与在用户iButton中安装初始服务数据的过程是一样的如果uData_Update是更新后的服务数据其签名数据被初始化为signInitial那么新签名可以按如下方法产生sign=createDataSignature(cAN,cSignPage,cSignSecretNum,uData_Update,signCode,uSignDataPage,uAN,uSignDataPageWCC)用用用用SHAiButton处理交易的摘要处理交易的摘要处理交易的摘要处理交易的摘要处理交易的主API调用总结如下无数据验证的静态数据服务无数据验证的静态数据服务无数据验证的静态数据服务无数据验证的静态数据服务//createarandomchangecodeincoprocessorchallenge=createChallenge(cAN,cAuthDataPage)//asktheuseriButtontorespondtothechallengeuResp=answerChallenge(uAN,uAuthDataPage,challenge)uData=uResp[0:31]uSignDataPageWCC=uResp[32:35]uMAC=uResp[36:55]//recreateuserdevice'sauthenticationsecretincoprocessor//inanunusedsecretnumber(wkSecretNum)s=bindSecretToiButton(cAN,cAuthDataPage,wkSecretNum,bindData,uAuthDataPage,uAN)//verifytheuserdevice'sresponseMACincoprocessorstatus=verifyAuthResponse(cAN,wkDataPage,uData,uAN,uAuthDataPage,uAuthDataPageWCC,challenge,uMAC)…有数据验证的静态数据服务有数据验证的静态数据服务有数据验证的静态数据服务有数据验证的静态数据服务//createarandomchangecodeincoprocessorchallenge=createChallenge(cAN,cAuthDataPage)//asktheuseriButtontorespondtothechallengeuResp=answerChallenge(uAN,uAuthDataPage,challenge)uData=uResp[0:31]using=uData[4:23]uSignDataPageWCC=uResp[32:35]AN15727of38uMAC=uResp[36:55]//recreateuserdevice'suniqueauthenticationsecretincoprocessor//inanunusedsecretnumber(wkSecretNum)s=bindSecretToiButton(cAN,cAuthDataPage,wkSecretNum,bindData,uAuthDataPage,uAN)//verifytheuserdevice'sresponseMACincoprocessorstatus=verifyAuthResponse(cAN,wkDataPage,uData,uAN,uAuthDataPage,uAuthDataPageWCC,challenge,uMAC)//recreatethedatasignatureincoprocessor//initializeuDatawithsignInitialuData_ini=…cSign=createDataSignature(cAN,cSignPage,cSignSecretNum,uData_ini,signCode,uSignDataPage,uAN,uSignDataPageWCC-1)//comparetheuSignandcSign….
动态数据服务动态数据服务动态数据服务动态数据服务//createarandomchangecodeincoprocessorchallenge=createChallenge(cAN,cAuthDataPage)//asktheuseriButtontorespondtothechallengeuResp=answerChallenge(uAN,uAuthDataPage,challenge)uData=uResp[0:31]uSignDataPageWCC=uResp[32:35]uMAC=uResp[36:55]//recreateuserdevice'suniqueauthenticationsecretincoprocessor//inanunusedsecretnumber(wkSecretNum)s=bindSecretToiButton(cAN,cAuthDataPage,wkSecretNum,bindData,uAuthDataPage,uAN)//verifytheuserdevice'sresponseMACincoprocessors=verifyAuthResponse(cAN,wkDataPage,uData,uAN,uAuthDataPage,uAuthDataPageWCC,challenge,uMAC)//recreatethedatasignatureincoprocessorcSign=createDataSignature(cAN,cSignPage,cSignSecretNum,uData_ini,signCode,uSignDataPage,uAN,uSignDataPageWCC-1)//comparetheuSignandcSign…//updatetheservicedataandrecomputesignaturesign=createDataSignature(cAN,cSignPage,cSignSecretNum,uData_Update,signCode,uSignDataPage,uAN,uSignDataPageWCC)//writethenewservicedataandsignature(upData)totheuseriButtons=writeDataPage(uAN,uAuthDataPage,upData)AN15728of38//authenticatetheuseriButtonandverifyservicedataagainchallenge=createChallenge(cAN,cAuthDataPage)//asktheuseriButtontorespondtothechallengeuResp=answerChallenge(uAN,uAuthDataPage,challenge)uData=uResp[0:31]uSignDataPageWCC=uResp[32:35]uMAC=uResp[36:55]//makesuretheuseriButtonreceivedtheupdateddata,compareuDataandupData…//verifytheuserdevice'sresponseMACincoprocessorstatus=verifyAuthResponse(cAN,wkDataPage,uData,uAN,uAuthDataPage,uAuthDataPageWCC,challenge,uMAC)附录附录附录附录A:执行执行执行执行API本节将讨论各种API的执行细节开发人员应该能够将其应用于所选择的计算机语言中注意这些列表不是实际可用的计算机代码只是用它们来说明基本的命令和数据流时序为简单起见列表未考虑误码校验和重试循环但在实际应用中通常需要进行误码校验和重试过程基本的基本的基本的基本的1-Wire器件器件器件器件I/O操作操作操作操作假设应用于适当平台的驱动器已提供了必要的1-Wire器件访问函数实际的函数名称可能与下列不同但功能应该是一样的我们假定下面的帮助函数已经提供给大家基本的基本的基本的基本的1-WireI/O操作操作操作操作表4S=select(devAN)选择地址编码(devAN)为给定参数的器件如果器件选择成功则调用的返回值为0S=select()选择devAN与前一次访问器件地址编码相同的器件如果器件选择成功则调用的返回值为0S=resume()恢复网络上前一次通信器件的通信如果器件选择成功则调用的返回值为0S=reset()复位1-Wire网如果成功完成操作则调用的返回值为0Data=readBytes(len)从选定器件读取字节值lenS=writeBytes(block,from,len)向选定的器件写入len字节(从数据块block内偏移量from开始)如果成功完成操作则调用的返回值为0TA1=lowAddress(page)返回数据页码的低位地址字节TA2=highAddress(page)返回数据页码的高位地址字节TA1S=lowSecretAddress(secretNum)返回密钥码的低位地址字节TA2S=highSecretAddress(secretNum)返回密钥码的高位地址字节AN15729of38C=CRC16(block,from,len,seed)根据已知的种子值seed计算len数据单元的CRC-16校验码数据块block内从偏移量from开始C=invCRC16(block,from,len,seed)根据传送的种子值seed计算len数据单元求反后的CRC-16校验码数据块block内从偏移量from开始向数据页写入数据向数据页写入数据向数据页写入数据向数据页写入数据(WRITEDATAPAGE)该API向数据页写入32个字节的数据块intstatus=writeDataPage(byte[]devAN,bytepageNum,byte[]data)变量字节说明devANbyte[8]目标iButton地址编码pageNumbyte目标页码databyte[32]待写数据块statusint0=没有错误状态值不为0意味着有错误发生根据实际的执行情况各状态值代表不同类型的错误TA1=lowAddress(pageNum)TA2=highAddress(pageNum)命令数据流注释select(…)devAN选择目标iButton进行通信EraseScratchpad[W]:{C3H,TA1,TA2}为后续I/O清除HIDE标志readBytes(len)读取足够的如len=5状态字节检查操作是否完成数值等于AAH意味着操作完成reset()复位上面的操作resume()与目标器件恢复通信WriteScratchpad[W]{0F,TA1,TA2,data}向暂存器写数据块readBytes(2)读取上述数据流求反后的CRC-16校验码TCU应该计算同一数据流的CRC-16并和从目标器件读取的数值进行比较不匹配意味着有I/O错误reset()resume()ReadScratchpad[W]AAH[R]{TA1,TA2,ES}读取地址和ES寄存器TCU应该检查这些读取值是否正确reset()resume()CopyScratchpad[W]{55H,TA1,TA2,ES}复制暂存器的数据到目标页readBytes(len)检查操作状态返回数据中AAH字节的值表明复制操作已经完成reset()复位网络和调用返回值设置错误陷阱和重复预置循环数的简化方法是将上述步骤处于一个循环中并在发生错误的时候使代码流跳至循环的开始部分这种方法容易实现但要牺牲其运行速度更严谨的错误陷阱是在每次命令调用中检查错误在有错误发生的时候只重复冲突部分的调用下表说明了这种简化方法AN15730of38命令命令命令命令数据流数据流数据流数据流注释注释注释注释loop=0start:loop=loop+1dowhileloop0)gotostartEraseScratchpad[W]:{C3H,TA1,TA2}为后续I/O清除HIDE标志readBytes(len){statusbytes}读取足够(如len=5)的状态字节以检查操作是否完成数值AAH表明操作完成if(thelaststatusbyteisnotAAH)gotostarts1=reset()复位上述操作s2=resume()恢复与目标器件的通信if(s10ors20)gotostartWriteScratchpad[W]{0F,TA1,TA2,data}向暂存器写入数据块readBytes(2){invCRC-16bytes}读取上述数据流求反后的CRC-16校验码TCU应该计算同一数据流的CRC-16校验码并将其与读自目标器件的值进行比较如果不匹配则说明有I/O错误if(CRCbytesdonotmatch)gotostarts1=reset()s2=resume()if(s10ors20)gotostartReadScratchpad[W]AAH[R]{TA1,TA2,ES}读取地址和ES寄存器TCU应该检验这些读取值是否正确if(TA1,TA2,andESdonotmatch)gotostartreset()resume()CopyScratchpad[W]{55H,TA1,TA2,ES}把暂存器的数据复制到目标页readBytes(len){statusbytes}检查操作状态返回数据中AAH字节的数值说明复制操作已经完成if(thelaststatusbyteAAH)gotostarts1=reset()复位网络endloop:if(loop>loopLimit)status=1elsestatus=0AN15731of38删除数据页删除数据页删除数据页删除数据页ERASEDATAPAGE通过向数据页内填补32个字节的FFH删除其内容intstatus=eraseDataPage(byte[]devAN,bytepageNum)变量类型说明devANbyte[8]目标iButton地址编码pageNumbyte目标页码statusint参见上述关于返回status变量的说明setdata[32]={32FFHbytes}status=writeDataPage(devAN,pageNum,data)将将将将MAC复制到密钥页复制到密钥页复制到密钥页复制到密钥页(COPYMACTOSECRET)API复制暂存器中产生的MAC的8个字节到密钥地址存储器这个函数通常在命令ComputeFirstSecret和ComputeNextSecret之后用于把暂存器中的部分MAC复制到密钥存储器intstatus=copyMACtoSecret(byte[]devAN,bytesecretNum)变量类型说明devANbyte[8]目标iButton地址编码secretNumbyte目标密钥号TA1S=lowSecretAddress(secretNum)TA2S=highSecretAddress(secretNum)settmp_data[32]={3200Hbytes}命令数据流注释select(devAN)选择目标iButton进行通信WriteScratchpad[W]{0FH,TA1S,TA2S,tmp_data}[R]{invertedCRC-16bytes}为下一次复制操作建立地址标志返回的CRC字节用于检测错误reset()resume()ReadScratchpad[W]AAH[R]{TA1S,TA2S,ES}读回地址和E/S寄存器TCU检查这些寄存器是否正确reset()resume()CopyScratchpad[W]{55H,TA1S,TA2S,ES}将密钥从暂存器复制到密钥号secretNum注意暂存器的8个字节被复制到密钥存储器readBytes(len)读取足够的状态字节以检测复制操作是否已经完成reset()AN15732of38安装系统密钥安装系统密钥安装系统密钥安装系统密钥(INSTALLSYSTEMSECRET)在服务安装和处理交易的过程中SHAiButton安装系统密钥用到了协处理器和用户iButton安装系统认证密钥和安装系统签名密钥的过程是一样的只是不同的片断系统签名密钥必须要装到协处理器的0号密钥中实现这一目的的API是installSystemSecretintstatus=installSystemSecret(byte[]devAN,bytepageNum,bytesecretNum,intnumPartials,byte[]partial)变量名类型说明devANbyte[8]目标iButton的地址编码pageNumbyte将片断写到器件的目标数据页secretNumbyte中间的和最后的目标密钥号numPartialsint片断的数量partialbyte[size]片断阵列它被定义为一维阵列size=47*numPartialsTA1=lowAddress(pageNum)TA2=highAddress(pageNum)TA1S=lowSecretAddress(secretNum)TA2S=highSecretAddress(secretNum)截取的片断截取的片断截取的片断截取的片断(PAD_PARTIAL[J])表5填补8个字节15个字节填补9个字节8个00H字节partial[j][32:46]9个00H字节命令命令命令命令数据流数据流数据流数据流注释注释注释注释j从从从从0循环到循环到循环到循环到numPartials-1将将将将partial[j]写到数据页写到数据页写到数据页写到数据页pageNumwriteDataPage(…)devAN,pageNum,partial[j][0:31]将partial[j]的前32个字节写到数据页pageNum将填充后的部分将填充后的部分将填充后的部分将填充后的部分(pad_partial)写到暂存器写到暂存器写到暂存器写到暂存器resume()WriteScratchpad[W]{0FH,TA1,TA2,pad_partial[j]}[R]{invertedCRC-16bytes}将填充后的绑定数据码写到暂存器返回求反后的CRC字节用于误码检验reset()resume()If(j=0)ComputeFirstSecretelseComputeNextSecretIf(j=0)[W]{33H,TA1,TA2,0F}else[W]{33H,TA1,TA2,F0}[R]{invertedCRC-16bytes}计算计算计算计算MAC(secret)根据j的值运行ComputeFirstSecret或者ComputeNextSecret函数MAC的部分结果置于暂存器中readBytes(len)读取足够的如len=5状态字节以检测操作是否完成值AAH说明成功reset()copyMACtoSecret(…)devAN,secretNum复制复制复制复制MAC的的的的8个字节到目标密钥个字节到目标密钥个字节到目标密钥个字节到目标密钥reset()循环结束AN15733of38将密钥绑定到用户将密钥绑定到用户将密钥绑定到用户将密钥绑定到用户iButton(BINDSECRETTOIBUTTON)通过将系统认证密钥绑定到服务数据页和器件地址编码产生唯一的器件认证密钥intstatus=bindSecretToiButton(byte[]devAN,bytepageNum,bytesecretNum,byte[]bindData,byteuAuthDataPage,byte[]uAN)变量类型说明devANbyte[8]目标器件地址编码pageNumbyte目标数据页secretNumbyte认证密钥号bindDatabyte[39]39个字节数据块的系统通用绑定数据uAuthDataPagebyte绑定数据的数据页码uANbyte[8]用户器件的地址编码TA1=lowAddress(pageNum)TA2=highAddress(pageNum)TA1S=lowSecretAddress(secretNum)TA2S=highSecretAddress(secretNum)截取绑定数据截取绑定数据截取绑定数据截取绑定数据(PAD_BIND)表6填补8个字节4个字节1个字节7个字节3个字节填补9个字节8个00H字节bindData[32:35]uAuthDataPageuAN[0:6]bindData[36:38]9个00H字节命令命令命令命令数据流数据流数据流数据流注释注释注释注释writeDataPage(…)devAN,pageNum,bindData[0:31]将绑定数据将绑定数据将绑定数据将绑定数据bindData[0:31]写到页写到页写到页写到页pageNum将截取后的绑定数据将截取后的绑定数据将截取后的绑定数据将截取后的绑定数据(pad_bind)写到暂存器写到暂存器写到暂存器写到暂存器resume()WriteScratchpad[W]{0FH,TA1,TA2,pad_bind}[R]{CRC-16bytes}将截取后的绑定数据写到暂存器TCU检查返回的操作状态字节CRC-16以检测错误reset()计算计算计算计算MAC(devicesecret)resume()ComputeNextSecret[W]{33H,TA1,TA2,F0}[R]{bytesofinvertedCRC-16}运行ComputeNextSecret函数MAC的部分结果存在暂存器中以进行下一次复制操作readBytes(len)读取足够的状态字节以检测操作是否完成reset()copyMACtoSecret(…)devAN,secretNum将器件密钥从暂存器复制到目标密钥将器件密钥从暂存器复制到目标密钥将器件密钥从暂存器复制到目标密钥将器件密钥从暂存器复制到目标密钥AN15734of38产生服务数据签名产生服务数据签名产生服务数据签名产生服务数据签名(CREATEDATASIGNATURE)该API利用服务数据系统签名密钥服务数据页码和它的写次数计数值用户iButton的地址编码为服务数据计算签名bytesig[]=createDataSignature(byte[]devAN,bytepageNum,bytesecretNum,byte[]uData,byte[]signCode,byteuSignDataPage,byte[]uAN,byte[]uSignDataPageWCC)如果调用成功则返回20个字节的MAC产生服务数据签名用到的参数和数据列于下面变量类型说明devANbyte[8]目标iButton的地址编码(协处理器)pageNumbyte为计算签名服务数据要被复制到的数据页码secretNumbyte存储系统签名密钥的密钥号必须是0uDatabyte[32]要签名的用户数据块signCodebyte[3]计算签名的系统通用代码uSignDataPagebyte用户iButton的服务数据页码用于计算签名uANbyte[8]计算签名的用户器件地址编码uSignDataPageWCCbyte[4]用户iButton中的写次数计数值(uSignDataPage)TA1=lowAddress(pageNum)TA2=highAddress(pageNum)考虑到I/O效应signCode和其它服务数据被截取成32个字节的数据块并立即写入暂存器截取签名数据截取签名数据截取签名数据截取签名数据(PAD_SIGNCODE)表7填补8个字节4个字节7个字节1个字节3个字节填补9个字节8个00H字节uSignDataPageWCC+17uAN[0:7]uSignDataPagesignCode9个00H字节命令命令命令命令数据流数据流数据流数据流注释注释注释注释writeDataPage(…)devAN,pageNum,uData将将将将uData写入页写入页写入页写入页pageNum将截取后的签名数据写入将截取后的签名数据写入将截取后的签名数据写入将截取后的签名数据写入(pad_signCode)暂存器暂存器暂存器暂存器resume()WriteScratchpad[W]{0FH,TA1,TA2,pad_signCode}[R]{inv.
CRCbytes}将截取后的签名数据pad_signCode写入暂存器reset()计算签名计算签名计算签名计算签名resume()7签名后的服务数据写入服务数据页后WCC1就成为其新的写次数计数值因为每次向页中写入数据写次数计数值都将增加1在第8到第15页上AN15735of38SignDataPage[W]{33H,TA1,TA2,C3}[R]{invCRC-16bytes}执行命令SignDataPage产生的MAC存入暂存器readBytes(len)读取足够的状态字节以检测操作是否完成reset()resume()ReadScratchpad[W]AAH[R]{TA1S,TA2S,ES,scratchpaddata,andCRCbytes}读取地址ES寄存器和暂存器20个字节的签名数据存储在偏移量从8开始的暂存器单元reset()复位1-Wire网络和返回值产生质询字节产生质询字节产生质询字节产生质询字节(CREATECHALLENGE)API返回3个字节的质询该质询通常在协处理器中产生SHA计算把SHA计数值作为一个输入参数每次执行SHA计算时计数器都会递增并且用户不会两次收到同一质询从这个意义上说该质询具有随机性因为SHA计算从数据页和暂存器取得输入数据所以把环境条件如温度湿度噪声电平和探测器的力度等作为计算的输入使得质询具有真正的随机性执行API只对SHA计数器的值与存储页和暂存器中的内容做出应答以提供不断变化的MACbyte[]challenge=createChallenge(byte[]devAN,bytepageNum)变量类型说明devANbyte[8]目标iButton地址编码pageNumbyte目标数据页码在这个简单执行中只用到与该页有关的密钥TA1=lowAddress(pageNum)TA2=highAddress(pageNum)命令命令命令命令数据流数据流数据流数据流注释注释注释注释select(…)devAN选择进行通信的器件EraseScratchpad[W]{C3H,TA1,TA2}清除HIDE标志以使暂存器数据可读reset()resume()ComputeChallenge[W]{33H,TA1,TA2,CCH}执行ComputeChallenge命令readBytes(2)[R]{invertedCRC-16bytes}读取命令求反后的CRC-16的两个字节TA1TA2和控制字节readBytes(len)检测SHA计算是否完成值AAH表明成功reset()resume()ReadScratchpad[R]{b0,b1,…b31}从暂存器读取32个字节SHA计算结果存储在偏移量为8到27的存储单元选取任意的三个字节作为想要的质询(=challenge)reset()复位1-Wire网络并返回值AN15736of38应答认证质询应答认证质询应答认证质询应答认证质询(ANSWERCHALLENGE)当用户iButton收到本地主机质询的时候用根据选定的数据页和器件认证密钥计算出的MAC进行应答byte[]resp=answerChallenge(byte[]devAN,bytepageNum,byte[]challenge)如果调用成功返回的一维字节阵列中包括以下数据如果有错误发生则为空uData[32]=resp[0:31]来自页pageNum的数据pageWCC[4]=resp[32:35]页pageNum的写次数计数器uMAC[20]=resp[36:55]认证应答MACTA1=lowAddress(pageNum)TA2=highAddress(pageNum)变量名类型说明devANbyte[8]目标器件地址编码pageNumbyte目标数据页码注意该页码必须与器件认证密钥号匹配challengebyte[3]质询字节respbyte[56]一维数据阵列包括在上述的每个表中考虑到I/O口的效应质询字节通常被截取为32个字节块以便写入暂存器pad_challenge截取质询字节截取质询字节截取质询字节截取质询字节(PAD_CHALLENGE)填补20个字节3个字节填补9个字节20个00H字节challenge9个00H字节命令命令命令命令数据流数据流数据流数据流注释注释注释注释将截取后的质询字节将截取后的质询字节将截取后的质询字节将截取后的质询字节(pad_challenge)写入暂存器写入暂存器写入暂存器写入暂存器select(…)devAN选择用户信息扭进行通信EraseScratchpad[W]{C3H,TA1,TA2}清除暂存器使器件准备好接受数据reset()resume()WriteScratchpad[W]{0FH,TA1,TA2,pad_challenge}将截取后的数据写入暂存器reset()计算应答计算应答计算应答计算应答MACresume()ReadAuth.
Page[W]{A5H,TA1,TA2}[R]{32bytesdatafromdatapage(uData),counterofdatapage(pageWCC),counterofsecretpage,invertedCRC-16ofcommand,address,data,andcounterbytes}(1)该命令使得用户信息纽基于鉴别密钥选定页的数据和来自暂存器的质询计算MAC(2)TCU将读取数据页的内容数据页的计数值密钥页的计数值以及命令求反后的CRC-16校验码地址数据和计数器字节readBytes(len)读取状态字节以检测SHA计算是否完成reset()读取应答读取应答读取应答读取应答MAC(uMAC)resume()AN15737of38ReadScratchpadR:{TA1,TA2,ES,32bytesscratchpaddata}uMACstartsatoffset8andendsat27从暂存器读取计算结果值得注意的是想要得到的MAC(20个字节)存储的起始偏移量为8reset()复位1-Wire网络和返回值验证认证应答验证认证应答验证认证应答验证认证应答(VERIFYAUTHRESPONSE)调用该API是为了验证用户iButton的鉴别应答是否正确在协处理器的工作空间密钥中生成了用户iButton的器件认证密钥后必须调用该函数intstatus=verifyAuthResponse(byte[]devAN,bytewkDataPage,byte[]uData,byte[]uAN,byteuPageNum,byte[]uPageWCC,byte[]challenge,byte[]uMAC)status=0用户应答MAC(uMAC)是有效的1用户应答是无效的-1有错误发生变量名类型说明devANbyte[8]目标器件地址编码wkDataPagebyte工作空间数据页码uDatabyte[32]用户器件数据页页码为uPageNum内容在质询用户器件进行认证应答时获得uANbyte[8]用户器件地址编码uPageNumbyte用户器件认证数据页码uPageWCCbyte[4]用户器件认证数据页写次数计数值challengebyte[3]质询字节用于质询用户iButton的认证MACuMACbyte[20]用户iButton的认证MACTA1W=lowAddress(wkDataPage)TA2W=highAddress(wkDataPage)考虑到I/O口效应质询其它服务和器件参数被截取为一个32个字节的页以便写入暂存器AN15738of38截取质询和服务参数截取质询和服务参数截取质询和服务参数截取质询和服务参数(PAD_AUTH)填补8个字节4个字节1个字节7个字节3个字节填补9个字节8个00H字节uPageWCCuPageNumuAN[0:6]challenge9个00H字节命令命令命令命令数据流数据流数据流数据流注释注释注释注释writeToDataPage(.
.
.
)devAN,wkDataPage,uData将将将将uData写入工作空间数据页写入工作空间数据页写入工作空间数据页写入工作空间数据页向暂存器写入服务参数和质询字节向暂存器写入服务参数和质询字节向暂存器写入服务参数和质询字节向暂存器写入服务参数和质询字节resume()WriteScratchpad[W]{0FH,TA1W,TA2W,pad_auth}[R]{invertedCRC-16bytes}将截取后的质询字节和服务参数写到暂存器reset()计算应答计算应答计算应答计算应答MACresume()ValidateDataPage[W]{33H,TA1W,TA2W,3CH}[R]{invertedCRC-16}计算结果置于暂存器中偏移量为8到27的存储单元readBytes(len)读取足够的如len=5状态字节以检测操作是否完成reset()核对用户核对用户核对用户核对用户iButton应答应答应答应答MACresume()MatchScratchpad[W]{3CH,uMAC}[R]{invertedCRC-16bytes,statusbytes}核对最后一个状态字节AAH=数据匹配FFH=数据不匹配reset()复位网络和返回值

云基Yunbase无视CC攻击(最高500G DDoS防御),美国洛杉矶CN2-GIA高防独立服务器,

云基yunbase怎么样?云基成立于2020年,目前主要提供高防海内外独立服务器,欢迎各类追求稳定和高防优质线路的用户。业务可选:洛杉矶CN2-GIA+高防(默认500G高防)、洛杉矶CN2-GIA(默认带50Gbps防御)、香港CN2-GIA高防(双向CN2GIA专线,突发带宽支持,15G-20G DDoS防御,无视CC)。目前,美国洛杉矶CN2-GIA高防独立服务器,8核16G,最高500G ...

€4.99/月Contabo云服务器,美国高性价比VPS/4核8G内存200G SSD存储

Contabo是一家运营了20多年的欧洲老牌主机商,之前主要是运营德国数据中心,Contabo在今年4月份增设新加坡数据中心,近期同时新增了美国纽约和西雅图数据中心。全球布局基本完成,目前可选的数据中心包括:德国本土、美国东部(纽约)、美国西部(西雅图)、美国中部(圣路易斯)和亚洲的新加坡数据中心。Contabo的之前国外主机测评网站有多次介绍,他们家的特点就是性价比高,而且这个高不是一般的高,是...

UCloud优刻得,新增1核1G内存AMD快杰云机型,服务器2元/首月,47元/年

UCloud优刻得近日针对全球大促活动进行了一次改版,这次改版更加优惠了,要比之前的优惠价格还要低一些,并且新增了1核心1G内存的快杰云服务器,2元/首年,47元/年,这个价格应该是目前市面上最低最便宜的云服务器产品了,有需要国内外便宜VPS云服务器的朋友可以关注一下。UCloud好不好,UCloud服务器怎么样?UCloud服务器值不值得购买UCloud是优刻得科技股份有限公司旗下拥有的云计算服...

签名代码为你推荐
magentomagento是哪年开发出来的,伴随着什么系统,整体运行效果,同类型的系统?支付宝蜻蜓发布怎么取得支付宝蜻蜓二代的代理?sqlserver2000挂起SQL server2000 安装为什么老是提示挂起?字节跳动回应TikTok易主互动百科被字节跳动收购意味着什么?支持http结点cuteftp厦门三五互联科技股份有限公司厦门三五互联科技股份有限公司广州分公司 待遇怎么样啊,电话营销的如何发帖子怎么发帖啊无忧登陆无忧登录好吗?drupal主题域名和服务器都有了,为什么还是打不开网站?
域名主机空间 服务器租用托管 中国万网虚拟主机 128m内存 免备案空间 permitrootlogin 监控宝 unsplash 地址大全 日本空间 彩虹ip 京东商城双十一活动 anylink asp免费空间申请 网站木马检测工具 徐正曦 亚马逊香港官网 爱奇艺vip免费试用7天 dnspod 东莞主机托管 更多