diff --git a/pythoncard/framework/applet.py b/pythoncard/framework/applet.py index d6f6a6a..832611f 100644 --- a/pythoncard/framework/applet.py +++ b/pythoncard/framework/applet.py @@ -24,8 +24,12 @@ def select(self): return True def selectingApplet(self): + """ that's weird ...""" return self._selectingApplet + def reSelectingApplet(self): + return False + @staticmethod def install(bArray, bOffset, bLength): """ diff --git a/pythoncard/framework/jcsystem.py b/pythoncard/framework/jcsystem.py index 4649859..e4be1d3 100644 --- a/pythoncard/framework/jcsystem.py +++ b/pythoncard/framework/jcsystem.py @@ -1,5 +1,21 @@ import warnings +ARRAY_TYPE_BOOLEAN = 1 +ARRAY_TYPE_BYTE = 2 +ARRAY_TYPE_INT = 4 +ARRAY_TYPE_OBJECT = 5 +ARRAY_TYPE_SHORT = 3 + +CLEAR_ON_DESELECT = 2 +CLEAR_ON_RESET = 1 + +MEMORY_TYPE_PERSISTENT = 0 +MEMORY_TYPE_TRANSIENT_DESELECT = 2 +MEMORY_TYPE_TRANSIENT_RESET = 1 + +NOT_A_TRANSIENT_OBJECT = 0 + + def abortTransaction(): pass @@ -27,6 +43,30 @@ def makeTransientObjectArray(length, event): def requestObjectDeletion(): pass -def getAvailableMemory(memoryType): +def getAvailableMemory(*args): """ return the max we can return """ - return 0x7fff + if len(args) == 1: + memoryType = args + return 0x7fff + elif len(args) == 3: + buffer, offset, memoryType = args + if buffer is None: + raise NullPointerException() + try: + buffer[offset] = 0x7f + buffer[offset+1] = 0xff + except IndexError: + raise ArrayIndexOutOfBoundsException() + else: + raise TypeError(args) + +def makeGlobalArray(type, length): + if length < 0: + raise NegativeArraySizeException() + warnings.warn("Array is not global") + val = {ARRAY_TYPE_BOOLEAN: False, + ARRAY_TYPE_BYTE: 0, + ARRAY_TYPE_INT: 0, + ARRAY_TYPE_OBJECT: None, + ARRAY_TYPE_SHORT: 0}[type] + return [val for i in range(length)] diff --git a/pythoncard/security/keybuilder.py b/pythoncard/security/keybuilder.py index f18001c..983894a 100644 --- a/pythoncard/security/keybuilder.py +++ b/pythoncard/security/keybuilder.py @@ -1,6 +1,20 @@ from pythoncard.security import publickey, privatekey, secretkey class KeyBuilder(object): + ALG_TYPE_AES = 2 + ALG_TYPE_DES = 1 + ALG_TYPE_DSA_PRIVATE = 4 + ALG_TYPE_DSA_PUBLIC = 3 + ALG_TYPE_EC_F2M_PRIVATE = 6 + ALG_TYPE_EC_F2M_PUBLIC = 5 + ALG_TYPE_EC_FP_PRIVATE = 8 + ALG_TYPE_EC_FP_PUBLIC = 7 + ALG_TYPE_HMAC = 9 + ALG_TYPE_KOREAN_SEED = 10 + ALG_TYPE_RSA_CRT_PRIVATE = 13 + ALG_TYPE_RSA_PRIVATE = 12 + ALG_TYPE_RSA_PUBLIC = 11 + LENGTH_AES_128 = 128 LENGTH_AES_192 = 192 LENGTH_AES_256 = 256 @@ -32,6 +46,7 @@ class KeyBuilder(object): LENGTH_RSA_736 = 736 LENGTH_RSA_768 = 768 LENGTH_RSA_896 = 896 + TYPE_AES = 15 TYPE_AES_TRANSIENT_DESELECT = 14 TYPE_AES_TRANSIENT_RESET = 13 @@ -55,7 +70,15 @@ class KeyBuilder(object): TYPE_RSA_PUBLIC = 4 @staticmethod - def buildKey(keyType, keyLength, keyEncryption): + def buildKey(*args): + if len(args) == 3: + keyType, keyLength, keyEncryption = args + elif len(args) == 4: + algorithmicKeyType, keyMemoryType, keyLength, keyEncryption = args + raise NotImplementedError(args) + else: + raise TypeError(args) + if keyType == KeyBuilder.TYPE_RSA_PUBLIC: return publickey.PyCryptoRSAPublicKey(keyLength) elif keyType == KeyBuilder.TYPE_RSA_PRIVATE: diff --git a/pythoncard/security/signature.py b/pythoncard/security/signature.py index 8de1cf0..59be985 100644 --- a/pythoncard/security/signature.py +++ b/pythoncard/security/signature.py @@ -1,41 +1,58 @@ class Signature(object): - ALG_AES_MAC_128_NOPAD = 18 - ALG_DES_MAC4_ISO9797_1_M2_ALG3 = 19 - ALG_DES_MAC4_ISO9797_M1 = 3 - ALG_DES_MAC4_ISO9797_M2 = 5 ALG_DES_MAC4_NOPAD = 1 - ALG_DES_MAC4_PKCS5 = 7 - ALG_DES_MAC8_ISO9797_1_M2_ALG3 = 20 + ALG_DES_MAC8_NOPAD = 2 + ALG_DES_MAC4_ISO9797_M1 = 3 ALG_DES_MAC8_ISO9797_M1 = 4 + ALG_DES_MAC4_ISO9797_M2 = 5 ALG_DES_MAC8_ISO9797_M2 = 6 - ALG_DES_MAC8_NOPAD = 2 + ALG_DES_MAC4_PKCS5 = 7 ALG_DES_MAC8_PKCS5 = 8 + ALG_RSA_SHA_ISO9796 = 9 + ALG_RSA_SHA_PKCS1 = 10 + ALG_RSA_MD5_PKCS1 = 11 + ALG_RSA_RIPEMD160_ISO9796 = 12 + ALG_RSA_RIPEMD160_PKCS1 = 13 ALG_DSA_SHA = 14 + ALG_RSA_SHA_RFC2409 = 15 + ALG_RSA_MD5_RFC2409 = 16 ALG_ECDSA_SHA = 17 - ALG_HMAC_MD5 = 28 - ALG_HMAC_RIPEMD160 = 29 + ALG_AES_MAC_128_NOPAD = 18 + ALG_DES_MAC4_ISO9797_1_M2_ALG3 = 19 + ALG_DES_MAC8_ISO9797_1_M2_ALG3 = 20 + ALG_RSA_SHA_PKCS1_PSS = 21 + ALG_RSA_MD5_PKCS1_PSS = 22 + ALG_RSA_RIPEMD160_PKCS1_PSS = 23 + ALG_HMAC_SHA1 = 24 ALG_HMAC_SHA_256 = 25 ALG_HMAC_SHA_384 = 26 ALG_HMAC_SHA_512 = 27 - ALG_HMAC_SHA1 = 24 - ALG_KOREAN_SEED_MAC_NOPAD = 32 - ALG_RSA_MD5_PKCS1 = 11 - ALG_RSA_MD5_PKCS1_PSS = 22 - ALG_RSA_MD5_RFC2409 = 16 - ALG_RSA_RIPEMD160_ISO9796 = 12 - ALG_RSA_RIPEMD160_ISO9796_MR = 31 - ALG_RSA_RIPEMD160_PKCS1 = 13 - ALG_RSA_RIPEMD160_PKCS1_PSS = 23 - ALG_RSA_SHA_ISO9796 = 9 + ALG_HMAC_MD5 = 28 + ALG_HMAC_RIPEMD160 = 29 ALG_RSA_SHA_ISO9796_MR = 30 - ALG_RSA_SHA_PKCS1 = 10 - ALG_RSA_SHA_PKCS1_PSS = 21 - ALG_RSA_SHA_RFC2409 = 15 + ALG_RSA_RIPEMD160_ISO9796_MR = 31 + ALG_KOREAN_SEED_MAC_NOPAD = 32 + MODE_SIGN = 1 MODE_VERIFY = 2 + SIG_CIPHER_DES_MAC4 = 1 + SIG_CIPHER_DES_MAC8 = 2 + SIG_CIPHER_RSA = 3 + SIG_CIPHER_DSA = 4 + SIG_CIPHER_ECDSA = 5 + SIG_CIPHER_AES_MAC128 = 6 + SIG_CIPHER_HMAC = 7 + SIG_CIPHER_KOREAN_SEED_MAC = 8 + @staticmethod - def getInstance(algorithm, externalaccess): + def getInstance(*args): + if len(args == 2): + algorithm, externalaccess = args + elif len(args) == 3: + messageDigestAlgorithm, cipherAlgorithm, paddingAlgorithm, externalAccess = args + raise NotImplementedError(args) + else: + raise TypeError(args) if algorithm in [Signature.ALG_RSA_SHA_PKCS1]: return _RSASHASignature(algorithm) raise CryptoException(CryptoException.NO_SUCH_ALGORITHM) diff --git a/pythoncardx/crypto/cipher.py b/pythoncardx/crypto/cipher.py index 9aee453..c0b2570 100644 --- a/pythoncardx/crypto/cipher.py +++ b/pythoncardx/crypto/cipher.py @@ -34,19 +34,72 @@ class Cipher(object): ALG_RSA_PKCS1_OAEP = 15 ALG_KOREAN_SEED_ECB_NOPAD = 16 ALG_KOREAN_SEED_CBC_NOPAD = 17 + ALG_AES_BLOCK_192_CBC_NOPAD = 18 + ALG_AES_BLOCK_192_ECB_NOPAD = 19 + ALG_AES_BLOCK_256_CBC_NOPAD = 20 + ALG_AES_BLOCK_256_ECB_NOPAD = 21 + ALG_AES_CBC_ISO9797_M1 = 22 + ALG_AES_CBC_ISO9797_M2 = 23 + ALG_AES_CBC_PKCS5 = 24 + ALG_AES_ECB_ISO9797_M1 = 25 + ALG_AES_ECB_ISO9797_M2 = 26 + ALG_AES_ECB_PKCS5 = 27 MODE_DECRYPT = 1 MODE_ENCRYPT = 2 + CIPHER_AES_CBC = 1 + CIPHER_AES_ECB = 2 + CIPHER_DES_CBC = 3 + CIPHER_DES_ECB = 4 + CIPHER_KOREAN_SEED_CBC = 5 + CIPHER_KOREAN_SEED_ECB = 6 + CIPHER_RSA = 7 + + PAD_NULL = 0 + PAD_NOPAD = 1 + PAD_ISO9797_M1 = 2 + PAD_ISO9797_M2 = 3 + PAD_ISO9797_1_M1_ALG3 = 4 + PAD_ISO9797_1_M2_ALG3 = 5 + PAD_PKCS5 = 6 + PAD_PKCS1 = 7 + PAD_PKCS1_PSS = 8 + PAD_PKCS1_OAEP = 9 + PAD_ISO9796 = 10 + PAD_ISO9796_MR = 11 + PAD_RFC2409 = 12 + + @staticmethod - def getInstance(algorithm, shared): + def getInstance(*args) + if len(args) == 2: + algorithm, externalAccess = args + elif len(args) == 3: + # map to old style algorithm name + cipherAlgorithm, paddingAlgorithm, externalAccess = args + if cipherAlgorithm == Cipher.CIPHER_RSA: + algorithm = dict([(Cipher.PAD_NOPAD, Cipher.ALG_RSA_NOPAD), + (Cipher.PAD_PKCS1, Cipher.ALG_RSA_PKCS1)]). \ + get(paddingAlgorithm, None) + elif cipherAlgorithm == Cipher.CIPHER_DES_CBC:, Cipher.CIPHER_DES_ECB]: + algorithm = dict([(Cipher.PAD_NOPAD, Cipher.ALG_DES_CBC_NOPAD), + (Cipher.PAD_PKCS5, Cipher.ALG_DES_CBC_PKCS5)]). \ + get(paddingAlgorithm, None) + elif cipherAlgorithm == Cipher.CIPHER_DES_ECB: + algorithm = dict([(Cipher.PAD_NOPAD, Cipher.ALG_DES_ECB_NOPAD), + (Cipher.PAD_PKCS5, Cipher.ALG_DES_ECB_PKCS5)]). \ + get(paddingAlgorithm, None) + else: + raise TypeError(args) + if algorithm in [Cipher.ALG_RSA_NOPAD, Cipher.ALG_RSA_PKCS1]: - return _PyCryptoRSACipher(algorithm) + return _PyCryptoRSACipher(algorithm) elif algorithm in [Cipher.ALG_DES_ECB_NOPAD, Cipher.ALG_DES_ECB_PKCS5, Cipher.ALG_DES_CBC_NOPAD, Cipher.ALG_DES_CBC_PKCS5]: - return _pyDesDESCipher(algorithm) + return _pyDesDESCipher(algorithm) print "algorithm not known: %d" % algorithm raise CryptoException(CryptoException.NO_SUCH_ALGORITHM)