1.¸ÅÊö
ÐÅÏ¢ÊÖÒյĿìËÙÉú³¤ÎªÈËÀàÉç»á´øÀ´ÁËÉî¿ÌµÄÀå¸ï¡£¡£¡£¡£Ëæ×ÅÅÌËã»úÊÖÒյĿìËÙÉú³¤£¬£¬£¬ÎÒ¹úÔÚµç×ÓÒøÐС¢µç×ÓÉÌÎñºÍµç×ÓÕþÎñµÈ·½ÃæµÄÆÕ±éÓ¦Ó㬣¬£¬Ê¹ÅÌËã»úÇå¾²ÎÊÌâÒѾÉîÈëµ½¹ú¼ÒµÄÕþÖΡ¢¾¼Ã¡¢ÎÄ»¯½¨ÉèµÈ¸÷¸öÁìÓò£¬£¬£¬±é²¼ÏÖ´úÐÅÏ¢»¯Éç»áµÄÊÂÇéºÍÉúÑĵÄÿ¸ö²ãÃæ¡£¡£¡£¡£ÒøÓéÓÅÔ½»áÌìÏ´ÓûÓÐÏñ½ñÌìÕâÑù¹Ø×¢ÖªÊ¶²úȨ¡¢Ð¡ÎÒ˽¼ÒÉí·ÝÐÅÏ¢ÒÔ¼°ÆäËûÃô¸ÐÐÅÏ¢µÄ±£»£»£»¤¡£¡£¡£¡£
¹úÃÜËã·¨ÊÇÖ¸Óɹú¼ÒÃÜÂëÖÎÀí¾ÖÖÆ¶©µÄһϵÁÐÃÜÂë±ê×¼£¬£¬£¬ÆäÓ¦ÓÃÁìÓòÊ®·ÖÆÕ±é£¬£¬£¬¿ÉÓÃÓÚ¶Ô¾ßÓÐÃô¸ÐÐÔµÄÄÚ²¿ÐÅÏ¢¡¢ÐÐÕþÊÂÎñÐÅÏ¢¡¢¾¼ÃÐÅÏ¢µÈ¾ÙÐмÓÃܱ£»£»£»¤¡£¡£¡£¡£ºÃ±È£ºÓÃÓÚÆóҵÎûÖÎÀí¡¢ÆóÒµÄÚ²¿µÄÖÖÖÖÃô¸ÐÐÅÏ¢µÄ´«Êä¼ÓÃÜ¡¢´æ´¢¼ÓÃÜ£¬£¬£¬±ÜÃâ²»·¨µÚÈý·½»ñÊØÐÅÏ¢ÄÚÈÝ£»£»£»Ò²¿ÉÓÃÓÚÖÖÖÖÇå¾²ÈÏÖ¤¡¢ÍøÉÏÒøÐС¢Êý×ÖÊðÃûµÈ¡£¡£¡£¡£
ÆäÖУ¬£¬£¬SM3ÃÜÂëÔÓ´ÕËã·¨ÊÇΪ֪×ãµç×ÓÈÏ֤ЧÀÍϵͳµÈÓ¦ÓÃÐèÇ󣬣¬£¬¹ú¼ÒÃÜÂëÖÎÀí¾ÖÓÚ2010Äê12ÔÂ17ÈÕÐû²¼¡£¡£¡£¡£¸Ã±ê×¼ÊÊÓÃÓÚÉÌÓÃÃÜÂëÓ¦ÓÃÖеÄÊý×ÖÊðÃûºÍÑéÖ¤¡¢ÐÂÎÅÈÏÖ¤ÂëµÄÌìÉúÓëÑéÖ¤ÒÔ¼°Ëæ»úÊýµÄÌìÉú£¬£¬£¬¿ÉÖª×ã¶àÖÖÃÜÂëÓ¦ÓõÄÇå¾²ÐèÇ󡣡£¡£¡£SM4·Ö×éÃÜÂëËã·¨£¬£¬£¬¹ú¼ÒÃÜÂëÖÎÀí¾ÖÓÚ2012Äê3ÔÂ21ÈÕÐû²¼£¬£¬£¬¸Ã±ê×¼ÊÊÓÃÓÚÃÜÂëÓ¦ÓÃÖÐʹÓ÷Ö×éÃÜÂëµÄÐèÇ󡣡£¡£¡£
ÏÖÔÚ³£¼ûµÄÖ§³Ö¹úÃÜËã·¨µÄ×°±¸ºÃ±ÈоƬÀàµÄTPM/TCM£¬£¬£¬ÍùÍùÊÜÏÞÓÚÆä±¾Ç®¶øÐÔÄܺܵͣ»£»£»ÐÔÄܽϸߵļÓÃÜ¿¨ÍùÍùÐèÒª¸ßÐÔÄܵÄÅÌËã»úÀ´ÅäºÏ£¬£¬£¬Õâ¾Í¸øÓû§´øÀ´Á˲»Ð¡µÄ±¾Ç®Ñ¹Á¦¡£¡£¡£¡£¶øÓë´Ëͬʱ£¬£¬£¬¾Óɼ¸´ú²úÆ·µÄÉú³¤£¬£¬£¬ÒøÓéÓÅÔ½»áCPUµÄÐÔÄÜÓÐÁË´ó·ùÌáÉý¡£¡£¡£¡£ÔÚ×¢ÖØÐ§ÄÜ£¬£¬£¬Ç¿µ÷ÐԼ۱ȵĽñÌ죬£¬£¬Óû§×ÔȻϣÍûÄܹ»³ä·ÖʹÓÃCPUµÄÅÌËãÄÜÁ¦£¬£¬£¬Óɴ˱㱬·¢ÁËʹÓÃCPUÖ¸ÁîÀ´ÊµÏÖ¹úÃÜËã·¨µÄÏë·¨¡£¡£¡£¡£Õâ¼´ÊÇÉè¼Æ»ùÓÚÒøÓéÓÅÔ½»áCPUµÄ¹úÃÜËã·¨¼ÓËÙÖ¸ÁîGMI£¨ÒÔϼò³ÆGMI£©µÄ³õÖ¾¡£¡£¡£¡£
GMIÊÇÒøÓéÓÅÔ½»áÒÀ¾Ý¹úÃÜËã·¨±ê×¼¶ø×ÔÖ÷Ñз¢Éè¼ÆÊµÏÖµÄÒ»×éÓ²¼þ¼ÓËÙÖ¸Á¡£¡£¡£¡£ÏÖÔÚÒѾʵÏÖÁËÁ½Ìõ¹úÃÜËã·¨Ö¸ÁSM3ºÍSM4¡£¡£¡£¡£ÆäÖУ¬£¬£¬SM4Ö§³Ö³£¼ûµÄECB¡¢CBC¡¢CTR¡¢OFB¡¢CFBÎåÖÖģʽ¡£¡£¡£¡£Í¨¹ý¶ÔGMIµÄʹÓ㬣¬£¬ÎÒÃDz»µ«ÄÜÈÃÃÜÂëѧËã·¨Ô½·¢Çå¾²Ò×Ó㬣¬£¬²¢ÇÒ»¹ÄÜ»ñµÃ±ÈÈí¼þʵÏָߵöàµÄÐÔÄÜ¡£¡£¡£¡£
SM2Ö¸Á£¬£¬¼´½«ÔÚÏÂÒ»´úÒøÓéÓÅÔ½»áGMIÀïÌí¼Ó£¬£¬£¬½ìʱ£¬£¬£¬GMI³ýÁËÖ§³ÖÉÏÃæÌáµ½µÄHASHËã·¨SM3£¬£¬£¬¶Ô³ÆËã·¨SM4£¬£¬£¬»¹½«Ö§³Ö·Ç¶Ô³ÆËã·¨SM2µÄ²¿·Ö»òËùÓй¦Ð§£¬£¬£¬°üÀ¨Ö§³ÖSM2ÊðÃûºÍÑéÖ¤£»£»£»SM2¼ÓÃÜÏ¢ÕùÃÜ£»£»£»SM2ÃÜÔ¿ÌìÉúºÍÃÜÔ¿½»Á÷µÈ¹¦Ð§¡£¡£¡£¡£¾´ÇëÆÚ´ý¡£¡£¡£¡£
ͼ±í 1. GMIÖ§³ÖµÄ¹úÃÜËã·¨Ö¸Áî
Ö¸Áî | Opcode | ˵Ã÷ |
CCS_HASH | 0xF3 0x0F 0xA6 0xE8 | SM3Ö¸Áî |
CCS_ENCRYPT | 0xF3 0x0F 0xA7 0xF0 | SM4Ö¸Áî |
±¾ÎĺóÃæµÄÕ½ڻá´ÓGMI´ø¸ø¿Í»§µÄ¼ÛÖµ£¬£¬£¬Ó¦ÓÃÄ£×Ó£¬£¬£¬Ö¸ÁîÏÈÈݺÍGMIÈí¼þ½â¾ö¼Æ»®µÈ½Ç¶È¸ø³öGMIÖ¸ÁîÔÚÒøÓéÓÅÔ½»áÖ÷Á÷CPUÉϵÄÐÔÄÜÆÀ²âÒªÁìºÍЧ¹û£¬£¬£¬ÒÔ¼°GMIÆÕ±éµÄʹÓó¡¾°¡£¡£¡£¡£²¢ÎªÀû±ã¿Í»§Ê¹ÓÃGMI£¬£¬£¬±¾ÎÄ»¹¶ÔÒøÓéÓÅÔ½»áGMIÅäÌ×Èí¼þ½â¾ö¼Æ»®¸ø³öÁ˽ÏΪÏêϸµÄÏÈÈÝ£¨¸ü¶àÊÊÅäÊÂÇéÒ²ÇëËæÊ±ÁªÏµÒøÓéÓÅÔ½»á£©¡£¡£¡£¡£
2.GMI´ø¸ø¿Í»§µÄ¼ÛÖµ
2.1 Ò×ÓÃÐÔ
¹Å°åµÄ¹úÃÜËã·¨µÄʹÓ÷½·¨ÖУ¬£¬£¬½ÏÁ¿³£¼ûµÄ¾ÍÊÇͨ¹ýÈí¼þ±à³ÌµÄ·½·¨À´ÊµÏÖÏìÓ¦µÄÃÜÂëËã·¨£¬£¬£¬Õâͨ³£¶¼ÐèÒª¾ÙÐдó×Ú¡¢ÖØ´óµÄ±à³Ì¡£¡£¡£¡£ÒÔOpenSSLΪÀý£¬£¬£¬ SM3¡¢SM4µÄ´úÂëÁ¿»òÐíÔÚ200~300ÐÐ×óÓÒ£¬£¬£¬¿ÉÊÇÔÚ½«ÕâЩÃÜÂëËã·¨¾ÙÐÐÓ²¼þÖ¸Áºó£¬£¬£¬Ô±¾ÐèҪʹÓÃÊý°ÙÐÐÖØ´ó±àÂë²Å¿ÉÒÔʵÏÖµÄËã·¨ÏÖÔÚÖ»ÐèÒª¼òÆÓŲÓÃÒ»ÌõÓ²¼þÖ¸Áî¼´¿ÉÍê³ÉÏìÓ¦µÄ²Ù×÷¡£¡£¡£¡£ÕâºÁÎÞÒÉÎÊ´ó´ó¼ò»¯Á˲Ù×÷µÄÖØÆ¯ºó£¬£¬£¬ÎªÓû§´øÀ´Á˼«´óµÄ±ãµ±ÐÔ¡£¡£¡£¡£
2.2 Çå¾²ÐÔ
ÖÚËùÖÜÖª£¬£¬£¬ÎÞÂÛÊÇÔÚÔËÐÐ֮ǰ£¬£¬£¬ÕÕ¾ÉÔÚÔËÐеÄÀú³ÌÖÐ, Èí¼þ×î³£Óöµ½µÄ¹¥»÷¾ÍÊDZ»²»·¨¸Ä¶¯¡£¡£¡£¡£Ê¹ÓÃÈí¼þ±à³ÌʵÏÖµÄÃÜÂëË㷨ҲͬÑù»áÊܵ½ÕâÀàÍþв¡£¡£¡£¡£È»¶øÓ²¼þ²»±£´æ±»¸Ä¶¯µÄΣº¦, Òò´ËÔÚ½«ÃÜÂëËã·¨Ó²¼þ¹Ì»¯ºó, Ò²¾ÍÏû³ýÁËÃÜÂëËã·¨±»²»·¨¸Ä¶¯µÄΣº¦£¬£¬£¬Áô¸ø¹¥»÷ÕߵĹ¥»÷ÃæÒ²ÏìÓ¦¼õС¡£¡£¡£¡£²¢ÇÒÔÚÃÜÂëË㷨ʵÏÖÓ²¼þ»¯ºó£¬£¬£¬²»Ö¹ÓÃÓÚʵÏÖËã·¨µÄ´úÂëÁ¿»á±äÉÙ£¬£¬£¬ÏìÓ¦µÄŲÓá¢Ê¹ÓÃÃÜÂëËã·¨µÄ´úÂëÁ¿Ò²»áËæ×ÅïÔÌ£¬£¬£¬ÕâÒ²¾ÍÒâζ×ÅÔÚ³ÌÐòÖÐÒýÈëbugµÄ¼¸ÂÊÒ²»á´ó´ó½µµÍ¡£¡£¡£¡£ÕâЩÎÞÒɶ¼´ó´óÔöÇ¿ÁËÓû§³ÌÐòµÄÇå¾²ÐÔ¡£¡£¡£¡£
2.3 ¸ßЧÐÔ
ͨ¹ý½«ÃÜÂëËã·¨Ó²¼þ»¯ºó£¬£¬£¬Ê¹µÃÃÜÂëËã·¨»ñµÃ¼«´óµÄÐÔÄÜÌáÉý£¬£¬£¬ÕâÕýÊÇÎÒÃÇÏ£Íû³ä·ÖʹÓÃCPUµÄÅÌËãÄÜÁ¦µÄ³õÖ¾¡£¡£¡£¡£ÎÒÃÇͨ¹ý½«GMIÒÔengine·½·¨¼¯³Éµ½OpenSSLºó£¬£¬£¬½èÖúÓÚOpenSSLµÄspeed benchmarkÏÂÁ£¬£¬²âÊÔÁËÈí¡¢Ó²¼þÁ½ÖÖ·½·¨ÏµĹúÃÜËã·¨µÄÐÔÄÜ£¨µ¥Ị̈߳©£¬£¬£¬¶ÔºÃ±ÈÏ£¨KX-6000/KX-5000/ZX-C+»®·ÖÊÇÒøÓéÓÅÔ½»áCPUÈý´ú²úÆ·µÄ´úºÅ£©£º
ͼ±í 2. SM3ÐÔÄܽÏÁ¿


´ÓÉÏÃæµÄÆÀ²âЧ¹û¿ÉÒÔ¿´µ½£¬£¬£¬Ëæ×ÅÕªÒªÊý¾ÝÁ¿µÄÔö´ó£¬£¬£¬ÔÚÖ÷ƵÏ൱µÄÇéÐÎÏ£¬£¬£¬GMIµÄÐÔÄÜÓÅÊÆÏà¹ØÓÚi7 CPUÓú·¢Ã÷ÏÔ£¬£¬£¬ÔÚ´óÊý¾ÝÁ¿ÏÂÐÔÄÜ¿ÉÒÔÊÇIntel i7µÄ2±¶ÒÔÉÏ£¬£¬£¬Òò´ËʹÓÃGMIÀ´ÊµÏÖSM3¼ÓÃܲúÆ·¿ÉÒÔʵÏÖÔÚ¸ü¶ÌµÄʱ¼äÄÚ¶Ô¸ü´óÊý¾ÝÁ¿µÄÕªÒªÅÌËã¡£¡£¡£¡£
ͼ±í 3. SM4-ECBÐÔÄܽÏÁ¿


ͼ±í 4. SM4-CBCÐÔÄܽÏÁ¿


ͼ±í 5. SM4-CTRÐÔÄܽÏÁ¿


ͼ±í 6. SM4-OFBÐÔÄܽÏÁ¿


ͼ±í 7. SM4-CFBÐÔÄܽÏÁ¿


SM4·Ö×éÃÜÂëËã·¨ÍùÍùÓÃÔÚ´óÊý¾Ý¼ÓÃܵij¡¾°Ï£¬£¬£¬Òò´ËÔÚÏÖʵӦÓÃÖÐÆäÊý¾ÝÁ¿ÍùÍùºÜÊǴ󡣡£¡£¡£Í¨¹ýÉÏÃæµÄÐÔÄÜÆÊÎö±ÈÕÕ¿ÉÒÔ¿´µ½£¬£¬£¬ÔÚÖ÷ƵÏ൱µÄÇéÐÎÏ£¬£¬£¬Ê¹ÓÃGMIºóµÄ¼ÓÃÜÐÔÄܾùÓÅÓÚi7ÐÔÄÜ¡£¡£¡£¡£ÌØÊâÊÇÔÚ´¦Öóͷ£´óÊý¾Ý¿éʱ£¬£¬£¬ÌáÉýÓÈÆäÏÔ×Å¡£¡£¡£¡£?
3.GMIµÄÓ¦ÓÃÄ£×Ó
3.1 SM3µÄÓ¦ÓÃÄ£×Ó
ÍêÕûÐÔÊÇÐÅÏ¢Çå¾²ÖÐÈý´ó»ù±¾ÒªËØCIA(confidentialityÉñÃØÐÔ£¬£¬£¬integrityÍêÕûÐÔ£¬£¬£¬availability¿ÉÓÃÐÔ)Ö®Ò»¡£¡£¡£¡£ÎªÁËÈ·±£ËùʹÓõÄÎļþ»òÕßÈí¼þÊÇûÓб»ºÚ¿Í¸Ä¶¯¹ýµÄ£¬£¬£¬ÍùÍùÐèҪУÑéÎļþµÄÍêÕûÐÔ¡£¡£¡£¡£ÏÖÔÚ½ÏÁ¿³£¼ûµÄÎļþУÑéËã·¨ÓÐÆæÅ¼Ð£ÑéºÍCRCУÑ飬£¬£¬¿ÉÊÇÕâÁ½ÖÖУÑ鲢ûÓп¹Êý¾Ý¸Ä¶¯µÄÄÜÁ¦¡£¡£¡£¡£È»¶ø£¬£¬£¬ÓÉÓÚ¹þÏ£Ëã·¨µÄÌØµã£¬£¬£¬SM3Ôò¿ÉÒÔУÑé³öí§Òⳤ¶ÈµÄ¸Ä¶¯¡£¡£¡£¡£Òò´Ë£¬£¬£¬Óû§Ö»ÐèҪŲÓÃGMIµÄSM3Ö¸ÁîÅÌËãËùÓõ½µÄÎļþ/Èí¼þµÄÕªÒªÖµ£¬£¬£¬ÓëÎļþ/Èí¼þ×Ô´øµÄУÑéÖµ¾ÙÐнÏÁ¿£¬£¬£¬¾Í¿ÉÒÔÄ¥Á·³öÎļþ/Èí¼þÊÇ·ñ±»¸Ä¶¯¹ý£¬£¬£¬°ü¹ÜÁËËùÓÃÎļþ/Èí¼þµÄÍêÕûÐÔ¡£¡£¡£¡£
±ðµÄ£¬£¬£¬ÓÉÓÚÔÚÅÌËãÐÅϢժҪʱ, Óû§ËùÌåÌùµÄÖ÷ÒªÊÇÐÂÎŵÄÍêÕûÐÔ£¬£¬£¬¶ø²»ÊÇÉñÃØÐÔ£¬£¬£¬Òò´Ë£¬£¬£¬ÔÚʹÓÃÐÔÄܽϵ͵ÄÇ徲оƬ»òÕß¼ÓÃÜ¿¨Ê±£¬£¬£¬¿ÉÒÔ½«ÅÌËãÕªÒªÖµµÄÊÂÇé½»¸øGMIµÄSM3Ö¸ÁîÀ´Íê³É£¬£¬£¬ÒÔ»ñÈ¡¸ü¸ßµÄϵͳÐÔÄÜ¡£¡£¡£¡£
3.2 SM4µÄÓ¦ÓÃÄ£×Ó
¸úÆäËûµÄ¶Ô³Æ¼Ó½âÃÜËã·¨Ò»Ñù£¬£¬£¬SM4ͬÑù¿ÉÒÔÓÃÔÚ¾²Ì¬Êý¾Ý¼ÓÃÜ¡¢´«ÊäÊý¾Ý¼ÓÃÜÒÔ¼°Ó¦ÓòãµÄÊý¾Ý¼ÓÃÜ¡£¡£¡£¡£
1)¾²Ì¬Êý¾Ý¼ÓÃÜ
¾²Ì¬Êý¾Ý¼ÓÃÜÒ»¸öµä·¶Ó¦ÓÃÊÇÈ«´ÅÅ̼ÓÃÜ¡£¡£¡£¡£Ëæ×ÅÐÅÏ¢µÄµç×Ó»¯£¬£¬£¬ÉúÑÄÔÚÅÌËã»úÉè±¹ØÁ¬ÄСÎÒ˽¼ÒÐÅÏ¢£¬£¬£¬ÉÌÒµÐÅÏ¢µÈÃô¸ÐÊý¾ÝµÄÇå¾²ÐÔÔ½À´Ô½Êܵ½ÈËÃǵÄÖØÊÓ¡£¡£¡£¡£¹ØÓÚСÎÒ˽¼Ò¿Í»§À´Ëµ£¬£¬£¬Ð¡ÎÒ˽¼ÒµÄÃÜÂ룬£¬£¬ÕÕÆ¬£¬£¬£¬ÊÓÆµµÈÒ»Ñùƽ³£¶¼ÊôÓÚÃô¸ÐÐÅÏ¢¡£¡£¡£¡£Ò»µ©ÕâЩÐÅÏ¢ÃæÁÙй¶£¬£¬£¬Ð¡ÎÒ˽¼ÒÒþ˽Êܵ½ÖØ´óÍþвʱ£¬£¬£¬ºÃ±È´æ´¢ÓÐÕâЩÐÅÏ¢µÄÅÌËã»ú×°±¸É¥Ê§»ò²»µÃ²»ÇëËûÈËάÐÞʱ£¬£¬£¬³£Ê¹ÓÃÈ«´ÅÅ̼ÓÃÜÊÖÒÕÀ´½â¾öÕâЩÎÊÌâ¡£¡£¡£¡£¹ØÓÚÆóÒµ¿Í»§»ò×éÖ¯À´Ëµ£¬£¬£¬Ðí¶àÖ÷ÒªµÄÉÌÒµÉñÃØÎļþ»òÕþ²ßÎļþÒ»µ©Ð¹Â¶¾Í»á¸øÆóÒµºÍ×éÖ¯´øÀ´ÖØ´óËðʧ¡£¡£¡£¡£´ÓһЩÊÓ²ìÀ´¿´£¬£¬£¬ÆóÒµ»ò×éÖ¯µÄÅÌËã»ú×°±¸Ò»Ñùƽ³£²»»á±»ÍµÇÔ£¬£¬£¬¶øÆäÊý¾Ýй¶µÄʱ»úÖ÷Òª±£´æÓÚ´¦Öóͷ£¾É×°±¸»ò¶ÔÅÌËã»ú×°±¸¾ÙÐÐάÐÞʱ¡£¡£¡£¡£È«´ÅÅ̼ÓÃÜÊÖÒÕ¿ÉÒÔÈÃÆóÒµ»ò×éÖ¯ÔÚ´¦Öóͷ£¾É×°±¸Ê±»ò¶Ô×°±¸¾ÙÐÐάÐÞʱ£¬£¬£¬×ÝÈ»ÃæÁÙÃô¸ÐÐÅϢй¶µÄÍþвҲÎÞºó¹ËÖ®ÓÇ¡£¡£¡£¡£
ÏÖÔÚ³£¼ûµÄÈ«´ÅÅ̼ÓÃܲúÆ·½ÓÄɵļÓÃÜËã·¨¶àΪAES Ëã·¨£¬£¬£¬ÕâÔÚº£ÄÚµÄһЩÏÖʵӦÓÃÖб£´æÕþ²ßΣº¦¡£¡£¡£¡£ÎªÁËÖª×ãÕâÀàÏÖʵӦÓõÄÐèÇ󣬣¬£¬º£ÄڵIJÙ×÷ϵͳ³§ÉÌ»òÓ¦ÓÃÈí¼þ³§ÉÌ»áÍÆ³öʹÓùúÃÜSM4 µÄÈ«´ÅÅ̼ÓÃܹ¦Ð§µÄ²Ù×÷ϵͳ»òÓ¦ÓÃÈí¼þ¡£¡£¡£¡£¶øÔÚÔÚÕâЩʵÏÖÖУ¬£¬£¬È«´ÅÅ̼ÓÃܹ¦Ð§Ò»Ñùƽ³£¶¼ÊÇʵʱµÄ¼Ó½âÃÜÊý¾Ý£¬£¬£¬Õâ¶Ô¼Ó½âÃÜÀú³ÌµÄÐÔÄÜÒªÇóÊǺܸߵ쬣¬£¬´Ëʱ¿ÉÒÔʹÓÃGMI ʵÏÖ¹úÃÜSM4 ÒÔÌæ»»¹Å°åµÄ´¿Èí¼þʵÏÖ£¬£¬£¬´Ó¶ø²»µ«ÄܱÜÃâËã·¨±»¸Ä¶¯£¬£¬£¬»¹ÄÜÌá¸ßÔËËãËÙÂÊ¡£¡£¡£¡£
2)ÔÆÓ¦ÓÃ
¹¹½¨¿ÉÐÅÔÆÆ½Ì¨Ê±£¬£¬£¬µ±ÔÆÖÐÓжÔÊý¾Ý×ö¼ÓÃÜÏ¢ÕùÃÜÐèÇóµÄʱ¼ä£¬£¬£¬¿ÉÒÔʹÓÃGMI ʵÏÖ¹úÃÜSM4 Ìæ»»¹Å°åµÄ´¿Èí¼þʵÏÖ£¬£¬£¬´Ó¶ø²»µ«ÄܱÜÃâËã·¨±»¸Ä¶¯£¬£¬£¬»¹ÄÜÌá¸ßÔËËãËÙÂÊ¡£¡£¡£¡£
3)Ó¦Óü¶¼ÓÃÜ
´ó²¿·ÖÆóÒµºÍÔÆÓ¦Óý«Ìṩ¶àÖÖÑ¡ÏîÀ´¶ÔÇå¾²ÐÅϢʹÓüÓÃÜÊÖÒÕ¡£¡£¡£¡£ºÃ±ÈÊý¾Ý¿â£¬£¬£¬Ó¦ÓÃЧÀÍÆ÷£¬£¬£¬ÖÐÐļþ£¬£¬£¬ÓʼþЧÀÍÆ÷ÒÔ¼°ÐéÄâ»úÖÎÀí³ÌÐòµÈ¶¼»áÓõ½SM4 ¼ÓÃÜÊÖÒÕ¡£¡£¡£¡£´Ëʱ¶¼¿ÉÒÔͨ¹ýGMI SM4 Ó²¼þʵÏÖÀ´Ìæ»»¹Å°åµÄÈí¼þʵÏÖ¡£¡£¡£¡£
4.GMIÖ¸ÁîÏÈÈÝ
4.1 GMI SM3
GMI SM3»ù±¾Ö¸Áî¸Å¿ö£¨ÒÔ32λϵͳΪÀý£©ÈçϱíËùʾ£º
ͼ±í 8. GMI SM3»ù±¾Ö¸Áî¸Å¿ö£¨ÒÔ32λϵͳΪÀý£©
Ö¸Áî | CCS_HASH |
Opcode | 0xF3 0x0F 0xA6 0xE8 |
Input Register | EAX | µ±EAX=0£¬£¬£¬ÔòÖ´ÐÐpadding; µ±EAX=-1£¬£¬£¬Ôò²»Ö´ÐÐpadding¡£¡£¡£¡£ |
EBX | ¼´ÊÇ0x20£¬£¬£¬ÔòÒÔΪSM3 Function±»Ê¹ÄÜ¡£¡£¡£¡£ |
ECX | ÊäÈëmessageµÄ´óС£¡£¡£¡£º µ±EAX=0£¬£¬£¬ÒÔbyteΪµ¥Î»ÅÌË㣻£»£» µ±EAX=-1£¬£¬£¬ÒÔblock£¨ 64 bytes£©Îªµ¥Î»ÅÌËã¡£¡£¡£¡£ |
RSI | Ö¸ÏòÊäÈëµÄmassage¡£¡£¡£¡£ |
RDI | Ö¸Ïò´æ·Å³õʼժҪֵµÄÄÚ´æ¿Õ¼ä¡£¡£¡£¡£ |
Output Register | EAX | µ±EAX=0£¬£¬£¬ÔòÖ´ÐÐÍêÖ¸Áîºó£¬£¬£¬EAX¼´ÊÇECX£»£»£» µ±EAX=-1£¬£¬£¬ÔòÎȹ̻¯¡£¡£¡£¡£ |
EBX | Îȹ̻¯¡£¡£¡£¡£ |
ECX | µ±EAX=0£¬£¬£¬ÔòÖ´ÐÐÍêÖ¸Áîºó£¬£¬£¬ECXÎȹ̻¯£»£»£» µ±EAX=-1£¬£¬£¬ÔòECX=0¡£¡£¡£¡£ |
ESI | Ö¸Ïò´ýÖ´ÐеÄÊý¾Ý¡£¡£¡£¡£ |
EDI | Îȹ̻¯¡£¡£¡£¡£×îÖÕÅÌËã³öÀ´µÄÕªÒªÖµ´æ·ÅÓڸõصãÖ¸ÏòµÄÄÚ´æ¿Õ¼ä¡£¡£¡£¡£ |
4.2 GMI SM4
GMI SM4»ù±¾Ö¸Áî¸Å¿ö£¨ÒÔ32λϵͳΪÀý£©ÈçϱíËùʾ£º
ͼ±í 9. GMI SM4»ù±¾Ö¸Áî¸Å¿ö£¨ÒÔ32λϵͳΪÀý£©
Ö¸Áî | CCS_ENCRYPT |
Opcode | 0xF3 0x0F 0xA7 0xF0 |
Input Register | EAX | µ±Bit[0]=0£¬£¬£¬×ö¼ÓÃÜÔËË㣻£»£»µ±Bit[0]=1£¬£¬£¬×ö½âÃÜÔËËã¡£¡£¡£¡£ Bit[5:1]=10000£¬£¬£¬Ê¹ÄÜSM4¹¦Ð§¡£¡£¡£¡£ Bit[10:6]:SM4ģʽѡÔñ Bit 6: ECB mode Bit 7: CBC mode Bit 8: CFB mode Bit 9: OFB mode Bit 10: CTR mode µ±Bit[11]=1£¬£¬£¬Ö´ÐÐMAC²Ù×÷£»£»£»²»È»²»Ö´ÐС£¡£¡£¡£ÇÒ½öÕë¶ÔCBCºÍCFBģʽÓÐÓᣡ£¡£¡£ |
EBX | Ö¸Ïòkey¡£¡£¡£¡£ |
ECX | Òª±»¼ÓÃÜ»ò½âÃܵÄÊý¾Ý³¤¶È¡£¡£¡£¡£µ¥Î»ÊÇ128-bitsµÄ¸öÊý¡£¡£¡£¡£ |
EDX | Ö¸ÏòIV¡£¡£¡£¡£ |
ESI | Ö¸ÏòÊäÈëmessage¡£¡£¡£¡£ |
EDI | Ö¸Ïò¼ÓÃÜ/½âÃÜЧ¹û¡£¡£¡£¡£ |
Output Register | EAX | Îȹ̻¯¡£¡£¡£¡£ |
EBX | Îȹ̻¯¡£¡£¡£¡£ |
ECX | 0 |
ESI | Ö¸ÏòÄ¿½ñ´ýÖ´ÐеÄÊý¾Ý¡£¡£¡£¡£ |
EDI | Ö¸ÏòÄ¿½ñ¼ÓÃÜ/½âÃܵÄЧ¹û¡£¡£¡£¡£ |
5.GMIÈí¼þ½â¾ö¼Æ»®
ÏÖÔÚ£¬£¬£¬ÒøÓéÓÅÔ½»áÌṩÒÔÏÂÈýÖÖÈí¼þ½â¾ö¼Æ»®£º
1)ʹÓÃOpenSSL EVP½Ó¿ÚʹÓÃGMI£»£»£»
2)ʹÓÃ×ÔÁ¦ÓÚOpenSSL¼Ü¹¹µÄLinux¿ª·¢¿âʹÓÃGMI£»£»£»
3)ʹÓÃGMIÖ¸ÁîSample Code×ÔÖ÷±à³ÌʹÓÃGMI¡£¡£¡£¡£
5.1 ʹÓÃOpenSSL EVP½Ó¿ÚʹÓÃGMI
OpenSSLÊÇÐÅÏ¢Çå¾²ÁìÓòʹÓÃ×îΪÆÕ±éµÄÃÜÂëѧËã·¨Ö§³ÖÈí¼þ¿â£¬£¬£¬ËüΪLinux¡¢Windows¡¢BSD¡¢Mac¡¢VMSµÈϵͳÌṩÁ˸»ºñµÄÃÜÂëѧËã·¨Ö§³Ö¡£¡£¡£¡£OpenSSLÏÕЩ¿ÉÒÔ×÷ΪÐÅÏ¢Çå¾²ÁìÓòµÄ±ê×¼ÃÜÂë¿â¡£¡£¡£¡£Òò´ËʵÏÖ»ùÓÚOpenSSLµÄGMIŲÓÃÒâÒåÖØ´ó¡£¡£¡£¡£
5.1.1 For OpenSSL 1.0.x and 1.1.0x
»ùÓÚ1.0.x°æ±¾ºÍ1.1.0x°æ±¾OpenSSL£¬£¬£¬ÎÒÃÇʵÏÖÁ˽«GMIÒÔGMI EngineµÄ·½·¨Ìí¼Óµ½OpenSSLÖС£¡£¡£¡£
GMIÔ´ÂëÁ´½Ó:https://github.com/ZXOpenSource/OpenSSL-ZX-GMI
GITÏÂÔØ:git clone https://github.com/ZXOpenSource/OpenSSL-ZX-GMI.git
»ùÓÚ1.0.x°æ±¾OpenSSL£¬£¬£¬°üÀ¨GMI EngineµÄ×îдúÂëΪ£ºopenssl-1.0.2j-ZX-GMI-1.2.tar.gz¡£¡£¡£¡£
»ùÓÚ1.1.0x°æ±¾OpenSSL£¬£¬£¬°üÀ¨GMI EngineµÄ×îдúÂëΪ£ºopenssl-1.1.0e-ZX-GMI-1.1.tar.gz¡£¡£¡£¡£
5.1.2 For OpenSSL 1.1.1x
»ùÓÚ1.1.1x°æ±¾µÄOpenSSL£¬£¬£¬ÎÒÃǽ«GMI EngineºÏ²¢½øÔ±¾¾Í±£´æÓÚOpenSSLµÄPadlock Engine£¬£¬£¬GMI Engine²»ÔÙÒÔµ¥¶ÀEngine±£´æ£¬£¬£¬¶øÊDZ»°üÀ¨½øPadlock EngineÀï¡£¡£¡£¡£ÏÖÔÚÕⲿ·Ö´úÂëÎÒÃÇÕýÔÚÍùOpenSSLÉçÇøÌá½»¡£¡£¡£¡£
»ùÓÚOpenSSL 1.1.1fÇÒ°üÀ¨ÁËGMIµÄÔ´Âë¿ÉÒÔÔÚÕâÀïÕÒµ½£º?
https://github.com/ZXOpenSource/OpenSSL-ZX-GMI
ΪÁ˽«Padlock Engine±àÒë½ølibcrypto.aÖУ¬£¬£¬ÇëÔÚ±àÒëOpenSSLµÄʱ¼äÏÔʽµØ¼ÓÉϱàÒëÑ¡Ïî-DPADLOCK_ASM¡£¡£¡£¡£
5.1.3µÚÈý·½Ó¦ÓóÌÐòͨ¹ýOpenSSLʹÓÃGMIµÄÒªÁì
ÎÒÃÇÊÇͨ¹ýOpenSSLµÄEVP½Ó¿ÚÀ´ÊµÏÖ¶ÔGMIÖ¸ÁîŲÓõġ£¡£¡£¡£
5.1.3.1GMI SM3
µÚÒ»²½£¬£¬£¬×¢²áGMI / Padlock Engine£»£»£»
? ? ? ? ʹÓÃOpenSSL×¢²á½Ó¿Ú£º
ENGINE_load_builtin_engines();
ENGINE_register_all_digests();?
µÚ¶þ²½£¬£¬£¬Å²ÓÃGMI¡£¡£¡£¡£Ê¹ÓÃOpenSSL EVP HASH½Ó¿Ú£¬£¬£¬ºÃ±ÈÒÔÏÂËĸö½Ó¿Ú£º
SM3 | int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count); int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size); int EVP_Digest(const void *data, size_t count, unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl); |
5.1.3.2GMI SM4
µÚÒ»²½£¬£¬£¬×¢²áGMI / Padlock Engine£»£»£»
? ? ? ? ʹÓÃOpenSSL×¢²á½Ó¿Ú£º
ENGINE_load_builtin_engines();
ENGINE_register_all_ciphers();
µÚ¶þ²½£¬£¬£¬Å²ÓÃGMI¡£¡£¡£¡£Ê¹ÓÃOpenSSL EVP Encrypt/Decrypt½Ó¿Ú£¬£¬£¬ºÃ±ÈÒÔϽӿڣº
SM4 Encrypt | int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl, const unsigned char *key, const unsigned char *iv); int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl); int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad); |
SM4 Decrypt | int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,?????????????????????? ENGINE *impl, const unsigned char *key, const unsigned char *iv); int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl); int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl); int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad); |
5.2 ʹÓÃ×ÔÁ¦ÓÚOpenSSL¼Ü¹¹µÄLinux¿ª·¢¿âʹÓÃGMI
Ö»¹ÜOpenSSL ÊÇÒµ½ç×îÊ¢ÐеÄÃÜÂëѧËã·¨¿â£¬£¬£¬µ«ÉÐÓÐÐí¶àµÄÓ¦Óó¡¾°ÊÇOpenSSLÎÞ·¨Öª×ã»òÕß²»Êʺϵġ£¡£¡£¡£Òò´Ë£¬£¬£¬ÊµÏÖ»ùÓÚÖ÷Á÷²Ù×÷ϵͳLinuxµÄÏìÓ¦¿ª·¢¿âÄܹ»ÎªÓû§ÁíÍâÌṩһÖÖʹÓÃÖ§³ÖGMIµÄÑ¡Ôñ¡£¡£¡£¡£
ͨ¹ýÑо¿¹ú¼Ò/ÐÐÒµµÄÏà¹Ø±ê×¼£¬£¬£¬µ÷ÑÐÒµ½ç¶Ô¼ÓÃÜ»ú/¼ÓÃÜ¿¨µÄÐèÌÖÇéÐΣ¬£¬£¬ÎÒÃÇ×ܽáÌáÁ¶ÁËÒøÓéÓÅÔ½»á¹úÃÜËã·¨Ö¸Á·¢¿âµÄ½Ó¿ÚÐèÇ󣬣¬£¬Éè¼ÆÁË»ùÓÚÒøÓéÓÅÔ½»á¹úÃÜËã·¨Ö¸ÁîµÄLinux¿ª·¢¿âµÄÕûÌå¼Ü¹¹²¢»ùÓÚ¸Ã¿â¸ø³öÁËÓ¦ÓÃÀý³ÌµÄdemo£¬£¬£¬ÓÃÒÔչʾͨ¹ýLinux¿ª·¢¿âʹÓÃÒøÓéÓÅÔ½»á¹úÃÜËã·¨Ö¸ÁîµÄÒªÁì¡£¡£¡£¡£
ÒøÓéÓÅÔ½»áLinux¿ª·¢¿âÏÖÔÚËùÖ§³ÖµÄÔËÐÐÇéÐÎÊÇLinux 64λÇéÐΡ£¡£¡£¡£Æä¶ÔÍâÌṩÁ½¸öÎļþ£¬£¬£¬»®·ÖÊǶ¯Ì¬¿âlibgmi.soºÍgmi.h£¨Ò²¿ÉÒÔÆ¾Ö¤¿Í»§µÄÐèÇó¶¨ÖÆ³ÉÆäËûÐÎʽºÃ±È¾²Ì¬¿âlibgmi.aÐÎʽ£©¡£¡£¡£¡£
Linux¿ª·¢¿âºÍŲÓÃdemo¿ÉÒÔÔÚÒøÓéÓÅÔ½»á¹ÙÍøhttp://www.zhaoxin.com/»ñÈ¡¡£¡£¡£¡£
5.2.1 GMI SM3
ÓëÇ°ÃæÌáµ½µÄËã·¨¿âOpenSSLÀàËÆ£¬£¬£¬ÎÒÃÇͨ¹ýLinux¿âµÄÐÎʽ¸øSM3Ëã·¨Ò²Ö÷ÒªÌṩÁËËĸö½Ó¿Úº¯Êý£¬£¬£¬»®·ÖÊÇ£º
int gmi_sm3_init() | ¹¦Ð§£º³õʼ»¯SM3£¬£¬£¬²¢ÅÐ¶Ï¸ÃÆ½Ì¨ÊÇ·ñÖ§³ÖGMIÖ¸Áî¡£¡£¡£¡£ ÊäÈ룺ÎÞ Êä³ö£ºÎÞ ·µ»ØÖµ£º1-ÌåÏÖ³õʼ»¯ÀÖ³É 0-ÌåÏÖ³õʼ»¯Ê§°Ü |
int gmi_sm3_update(const void *data_, size_t len) | ¹¦Ð§£º ¶Ôlen bytes of data at *data×öSM3 updateÅÌËã¡£¡£¡£¡£ÓÃÓÚgmi_sm3_init()Ö®ºógmi_sm3_final()֮ǰ£¬£¬£¬¿ÉÒÔ¶à´ÎŲÓ㬣¬£¬ÒÔÅÌËãÊèÉ¢ÔÚ²î±ðbufferµÄÊý¾Ý¡£¡£¡£¡£ ÊäÈ룺 const void *data_£ºÒªSM3µÄÊý¾ÝµØµã size_t len£ºÒªSM3µÄÊý¾ÝµÄ³¤¶È£¬£¬£¬µ¥Î»byte Êä³ö£ºÎÞ ·µ»ØÖµ£º1-ÌåÏÖÖ´ÐÐÀÖ³É 0-ÌåÏÖÖ´ÐÐʧ°Ü |
int gmi_sm3_final(unsigned char *md) | ¹¦Ð§£ºSM3ÅÌËãµÄ×îºóÒ»²½ ÊäÈ룺ÎÞ Êä³ö£º unsigned char *md£ºÖ¸ÏòSM3µÄЧ¹û ·µ»ØÖµ£º1-ÌåÏÖÖ´ÐÐÀÖ³É 0-ÌåÏÖÖ´ÐÐʧ°Ü |
int gmi_sm3(uint8_t *InBuf, uint64_t len, uint8_t *OutBuf) ? | ¹¦Ð§£º´ÓInBufÊäÈëlen bytesÊý¾Ý×öSM3ÅÌË㣬£¬£¬ÅÌËãЧ¹û·Åµ½OutBufÖ¸ÏòµÄ´æ´¢ÇøÓò¡£¡£¡£¡£ ÊäÈ룺 uint8_t *InBuf£ºÒªSM3µÄÊý¾ÝµØµã uint64_t len£ºÒªSM3µÄÊý¾Ý³¤¶È£¬£¬£¬µ¥Î»byte Êä³ö£º uint8_t *OutBuf£ºÖ¸ÏòSM3µÄЧ¹û ·µ»ØÖµ£º1-ÌåÏÖÖ´ÐÐÀÖ³É 0-ÌåÏÖÖ´ÐÐʧ°Ü |
5.2.2 GMI SM4
ÓëÇ°ÃæÌáµ½µÄËã·¨¿âOpenSSLÀàËÆ£¬£¬£¬ÎÒÃÇͨ¹ýLinux¿âµÄÐÎʽ¸øSM4Ëã·¨Ò²Ö÷ÒªÌṩÁËÎå¸ö½Ó¿Úº¯Êý£¬£¬£¬»®·ÖÊÇ£º
int SM4_Init(const unsigned int? cipher_mode, const unsigned char *key,const unsigned char *iv, int enc) ? | ¹¦Ð§£º³õʼ»¯SM4ÅÌË㣬£¬£¬²¢ÅÐ¶Ï¸ÃÆ½Ì¨ÊÇ·ñÖ§³ÖGMIÖ¸Áî¡£¡£¡£¡£ ÊäÈ룺 const unsigned int? cipher_mode£º¿ÉÊäÈëÖµÓУº #define SM4_ECB_MODE 0x1 #define SM4_CBC_MODE 0x2 #define SM4_CFB_MODE 0x3 #define SM4_OFB_MODE 0x4 #define SM4_CTR_MODE 0x5 const unsigned char *key£º¼ÓÈëSM4ÅÌËãµÄkey const unsigned char *iv£º¼ÓÈëSM4ÅÌËãµÄiv»òÕßcounter int enc£º enc =1£¬£¬£¬ÌåÏÖ¾ÙÐмÓÃÜÅÌË㣻£»£» enc =0£¬£¬£¬ÌåÏÖ¾ÙÐнâÃÜÅÌËã Êä³ö£ºÎÞ ·µ»ØÖµ£º1-ÌåÏÖÖ´ÐÐÀÖ³É 0-ÌåÏÖÖ´ÐÐʧ°Ü |
int SM4_Update(unsigned char *out, int *outl, const unsigned char *in, int inl) ? | ¹¦Ð§£º¶ÔinÊäÈëµÄinl bytesÊý¾Ý×öSM4 updateÅÌË㣬£¬£¬Ð§¹ûΪout£¬£¬£¬³¤¶ÈΪoutl ÊäÈ룺 unsigned char *out£ºupdateÅÌËãºóµÄÊä³ö£¬£¬£¬ int *outl£ºupdateÅÌËãºóÊä³öµÄ³¤¶È const unsigned char *in£ºupdateÅÌËãµÄÊäÈëÊý¾Ý int inl£ºupdateÅÌËãÊäÈëÊý¾ÝµÄ³¤¶È Êä³ö£ºÎÞ ·µ»ØÖµ£º1-ÌåÏÖÖ´ÐÐÀÖ³É 0-ÌåÏÖÖ´ÐÐʧ°Ü |
int SM4_Final(unsigned char *out, int *outl) ? | ¹¦Ð§£ºSM4ÅÌËãµÄ×îºóÒ»²½ ÊäÈ룺ÎÞ Êä³ö£º unsigned char *out£ºÖ¸ÏòfinalÅÌËãµÄЧ¹û int *outl£ºfinalÅÌËãЧ¹ûµÄ³¤¶È ·µ»ØÖµ£º1-ÌåÏÖÖ´ÐÐÀÖ³É 0-ÌåÏÖÖ´ÐÐʧ°Ü |
int SM4_set_padding(int pad) | ¹¦Ð§£ºÉèÖÃÊÇ·ñpaddingµÄflag ÊäÈ룺 int pad£ºpad=1£¬£¬£¬ÌåÏÖÐèÒªpadding£»£»£»pad=0£¬£¬£¬ÌåÏÖ²»ÐèÒªpadding¡£¡£¡£¡£ Êä³ö£ºÎÞ ·µ»ØÖµ£º1-ÌåÏÖÖ´ÐÐÀÖ³É 0-ÌåÏÖÖ´ÐÐʧ°Ü |
int gmi_sm4(unsigned char *in_data, int inl, unsigned char *iv, int mode, unsigned char *key, int encrypt, unsigned char *out_data,? int *outl) ? | ¹¦Ð§£ºÊ¹³¤¶ÈΪinlµÄin_dataÊý¾Ý£¬£¬£¬ÃÜԿΪkey£¬£¬£¬iv»òÕßcounterΪiv£¬£¬£¬×öSM4-mode encrypt/decryptÅÌË㣬£¬£¬×îÖÕЧ¹û·ÅÔÚout_data¡£¡£¡£¡£ ÊäÈ룺 unsigned char *in_data£ºÖ¸ÏòÊäÈëÊý¾Ý int inl£ºÊäÈëÊý¾ÝµÄ³¤¶È unsigned char *iv£ºÊäÈëiv»òÕßcounter int mode£ºÄ£Ê½£¬£¬£¬¿ÉÒÔ´ÓÒÔÏÂÎåÖÖģʽÖÐÑ¡Ôñ£º #define SM4_ECB_MODE 0x1 #define SM4_CBC_MODE 0x2 #define SM4_CFB_MODE 0x3 #define SM4_OFB_MODE 0x4 #define SM4_CTR_MODE 0x5 unsigned char *key£ºkey int encrypt£ºencrypt =1£¬£¬£¬×ö¼ÓÃÜÅÌË㣻£»£»encrypt=0£¬£¬£¬×ö½âÃÜÅÌËã Êä³ö£º unsigned char *out_data£ºÖ¸ÏòSM4ÅÌËãµÄЧ¹û int *outl:Ч¹ûµÄ³¤¶È¡£¡£¡£¡£ ·µ»ØÖµ£º1-ÌåÏÖÖ´ÐÐÀÖ³É 0-ÌåÏÖÖ´ÐÐʧ°Ü |
5.3ʹÓÃGMIÖ¸ÁîSample Code×ÔÖ÷±à³ÌʹÓÃGMI?
ÈôÊÇÄú²»Ê¹ÓÃÇ°ÃæÕ½ÚÌáµ½µÄÒøÓéÓÅÔ½»áGMIÈí¼þ½â¾ö¼Æ»®£¬£¬£¬Ï£ÍûÄܹ»×Ô¼º±à³ÌÀ´Ê¹ÓÃGMI£¬£¬£¬ËäȻҲÊÇ¿ÉÒԵġ£¡£¡£¡£ÏÂÃæ¸½ÉÏGMIÖ¸ÁîÔÚ32λºÍ64λµÄsample code¡£¡£¡£¡£
5.3.1 GMI SM3
l? 32λϵͳ£º
.size??? gmi_sm3_oneshot,.-.L_gmi_sm3_oneshot_begin .globl?? gmi_sm3_blocks .type??? gmi_sm3_blocks,@function .align?? 16 gmi_sm3_blocks: .L_gmi_sm3_blocks_begin: ???? pushl??? %ebx ???? pushl??? %edi? ???? pushl??? %esi ???? movl 16(%esp),%edi ???? movl 20(%esp),%esi ???? movl 24(%esp),%ecx ???? movl %esp,%edx ???? addl $-128,%esp ???? movups?? (%edi),%xmm0 ???? andl $-16,%esp ???? movups?? 16(%edi),%xmm1 ???? movaps?? %xmm0,(%esp) ???? movl %esp,%edi ???? movaps?? %xmm1,16(%esp) ???? movl $32,%ebx ???? movl $-1,%eax .byte??? 0xf3,0x0f,0xa6,0xe8 ???? movaps?? (%esp),%xmm0 ???? movaps?? 16(%esp),%xmm1 ???? movl %edx,%esp ???? movl 16(%esp),%edi ???? movups?? %xmm0,(%edi) ???? movups?? %xmm1,16(%edi) ???? popl %esi ???? popl %edi ???? popl %ebx ???? ret .size??? gmi_sm3_blocks,.-.L_gmi_sm3_blocks_begin |
?
l? 64λϵͳ
.globl?? gmi_sm3_blocks .type??? gmi_sm3_blocks,@function .align?? 16 gmi_sm3_blocks: ???? movq %rbx,%r11 ???? movq %rdx,%rcx ???? movq %rdi,%rdx ???? movups?? (%rdi),%xmm0 ???? subq $128+8,%rsp ???? movups?? 16(%rdi),%xmm1 ???? movaps?? %xmm0,(%rsp) ???? movq %rsp,%rdi ???? movaps?? %xmm1,16(%rsp) ???? movq $32,%rbx ???? movq $-1,%rax .byte??? 0xf3,0x0f,0xa6,0xe8 ???? movaps?? (%rsp),%xmm0 ???? movaps?? 16(%rsp),%xmm1 ???? addq $128+8,%rsp ???? movups?? %xmm0,(%rdx) ???? movups?? %xmm1,16(%rdx) ???? movq %r11,%rbx ???? .byte??? 0xf3,0xc3 .size??? gmi_sm3_blocks,.-gmi_sm3_blocks |
5.3.2 GMI SM4
l? 32λϵͳ£º
.globl?? gmi_gx6_sm4_encrypt .type??? gmi_gx6_sm4_encrypt,@function .align?? 16 gmi_gx6_sm4_encrypt: .L_gmi_gx6_sm4_encrypt_begin: ???? pushl??? %ebx ???? pushl??? %edi ???? pushl??? %esi ???? movl 16(%esp),%edi ???? movl 20(%esp),%esi ???? movl 24(%esp),%edx ???? movl 28(%esp),%ecx ???? leal 32(%edx),%ebx ???? shrl $4,%ecx ???? movl 16(%edx),%eax .byte??? 0xf3,0x0f,0xa7,0xf0 ???? popl %esi ???? popl %edi ???? popl %ebx ???? ret .size??? gmi_gx6_sm4_encrypt,.-.L_gmi_gx6_sm4_encrypt_begin |
l? 64λϵͳ£º
.globl? gmi_gx6_sm4_encrypt .type?? gmi_gx6_sm4_encrypt,@function .align? 16 gmi_gx6_sm4_encrypt: ??? pushq?? %rbp ??? pushq?? %rbx ??? pushq?? %rdi ??? pushq?? %rsi ??? leaq 32(%rdx),%rbx ??? shrq $4,%rcx ??? movq 16(%rdx),%rax .byte?? 0xf3,0x0f,0xa7,0xf0 ??? popq %rsi ??? popq %rdi ??? popq %rbx ??? popq %rbp ??? .byte?? 0xf3,0xc3 .size?? gmi_gx6_sm4_encrypt,.-gmi_gx6_sm4_encrypt |