Skip to content

Commit

Permalink
Add some functionnalities from JC 3.0.4 (at least on the interface)
Browse files Browse the repository at this point in the history
  • Loading branch information
benallard committed Jun 19, 2012
1 parent 2eb6165 commit c12d823
Show file tree
Hide file tree
Showing 5 changed files with 166 additions and 29 deletions.
4 changes: 4 additions & 0 deletions pythoncard/framework/applet.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down
44 changes: 42 additions & 2 deletions pythoncard/framework/jcsystem.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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)]
25 changes: 24 additions & 1 deletion pythoncard/security/keybuilder.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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:
Expand Down
63 changes: 40 additions & 23 deletions pythoncard/security/signature.py
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
59 changes: 56 additions & 3 deletions pythoncardx/crypto/cipher.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down

0 comments on commit c12d823

Please sign in to comment.