2016-02-25 43 views
1

我正在尝试使用python代码向HSM(Thales paysheild 9000)发送命令。但是,我从代码中得到的回应并不是所期望的。将命令发送到HSM时发出问题

Input: HEADJA12345678912306 #generate random pin of length 6 
Ouput: HEADJA12315 

任何人都可以帮助我找出问题吗?理想情况下,回应应该有JB而不是JA,我将其作为输出。

以下是代码。

#!/usr/bin/python 
import socket, binascii, string 
from struct import * 
import time; 

TCP_IP = 'localhost' 
TCP_PORT = 6511 

COMMAND = 'HEADJA12345678912306' 

def testPrintable(str): 
    return all(c in string.printable for c in str) 

def buildCommand(command): 
    hCommand = '' 
    i = 0 
    while True: 
     if (command[i:i+1] == '<'): 
      i = i + 1 
      while True: 
       hCommand = hCommand + binascii.a2b_hex(command[i:i+2]) 
       i = i + 2 
       if (command[i:i+1] == '>'): 
        i = i + 1 
        break 
     else: 
      hCommand = hCommand + command[i] 
      i = i + 1 
     if (i == len(command)): 
      break 
    return hCommand 

def main(): 
    global TCP_IP 
    global TCP_PORT 
    global COMMAND 

    connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    connection.connect((TCP_IP, TCP_PORT)) 

    BUFFER_SIZE = 1024 

    COMMAND = buildCommand(COMMAND) 
    SIZE=pack('>h',len(COMMAND)) 
    MESSAGE = SIZE + COMMAND 
    connection.send(MESSAGE) 
    data = connection.recv(BUFFER_SIZE) 

    if (testPrintable(MESSAGE[2:])): 
     print "sent data (ASCII) :", MESSAGE[2:] 
    print "sent data (HEX) :", MESSAGE.encode('hex') 
    if (testPrintable(data[2:])): 
     print "received data (ASCII):", data[2:] 

    print "received data (HEX) :", data.encode('hex') 
    connection.close() 

if __name__ == "__main__": 
    main() 
+0

您正在使用什么样的HSM?你的代码在哪里?我们该如何调试呢? – duskwuff

回答

1

HSM的设计方式是,如果它收到任何不在其列表中的命令,它将不会提供任何正确的输出。这是为了增加安全性并防止外部黑客入侵。就像你的情况一样,你不知道发生了什么。幸运的是,问题是标题长度。但在某些情况下,它可能是任何其他问题,HSM不会给出正确的错误代码。

+0

是的。如果HSM收到任何可疑/完全错误的命令,HSM将只提供某些错误代码并保持不变。 –

2

问题已解决,我使用的标题长度不正确。纠正标题长度后,HSM以正确的信息回应。