[Python-modules-commits] [pykcs11] 01/05: New upstream version 1.4.2
Ludovic Rousseau
rousseau at moszumanska.debian.org
Sun May 21 14:08:15 UTC 2017
This is an automated email from the git hooks/post-receive script.
rousseau pushed a commit to branch master
in repository pykcs11.
commit f2080b5152db8957d0904b8baaadbd8ca03ce892
Author: Ludovic Rousseau <rousseau at debian.org>
Date: Sun May 21 15:22:40 2017 +0200
New upstream version 1.4.2
---
Makefile | 8 +-
PKG-INFO | 4 +-
PyKCS11/LowLevel.py | 4 +-
PyKCS11/__init__.py | 23 +++--
readme.txt | 185 ---------------------------------------
samples/LowLevel/InitTokenPin.py | 7 +-
samples/LowLevel/dumpit.py | 7 +-
samples/LowLevel/rand.py | 7 +-
samples/LowLevel/test.py | 7 +-
samples/LowLevel/test1.py | 7 +-
setup.py | 4 +-
src/pkcs11lib.cpp | 17 ++--
src/pkcs11lib.h | 2 +-
src/pykcs11_wrap.cpp | 13 +--
14 files changed, 58 insertions(+), 237 deletions(-)
diff --git a/Makefile b/Makefile
index 21bc943..f0cd4cd 100644
--- a/Makefile
+++ b/Makefile
@@ -1,13 +1,9 @@
# give some default values
-PREFIX ?= /usr
DESTDIR ?= /
ifeq (, $(PYTHON))
PYTHON=python
endif
-IS_PYTHON_3 = $(shell $(PYTHON) -c 'import sys; print(sys.version_info[0] >= 3)')
-ifeq ($(IS_PYTHON_3), True)
-SWIG_OPTS := -py3
-endif
+PREFIX ?= $(shell $(PYTHON) -c 'import sys; print(sys.prefix)')
build: build-stamp
@@ -29,7 +25,7 @@ clean distclean:
rebuild: clean build
src/pykcs11_wrap.cpp: src/pykcs11.i
- cd src ; swig -c++ -python $(SWIG_OPTS) pykcs11.i ; mv pykcs11_wrap.cxx pykcs11_wrap.cpp ; mv LowLevel.py ../PyKCS11
+ cd src ; swig -c++ -python pykcs11.i ; mv pykcs11_wrap.cxx pykcs11_wrap.cpp ; mv LowLevel.py ../PyKCS11
src/pykcs11.i: src/opensc/pkcs11.h src/pkcs11lib.h src/pykcs11string.h src/ck_attribute_smart.h
touch $@
diff --git a/PKG-INFO b/PKG-INFO
index 2e9f8e3..4907aa5 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,8 +1,8 @@
Metadata-Version: 1.1
Name: PyKCS11
-Version: 1.4.1
+Version: 1.4.2
Summary: A Full PKCS#11 wrapper for Python
-Home-page: https://bitbucket.org/PyKCS11/pykcs11
+Home-page: https://github.com/LudovicRousseau/PyKCS11
Author: Ludovic Rousseau
Author-email: ludovic.rousseau at free.fr
License: GPL
diff --git a/PyKCS11/LowLevel.py b/PyKCS11/LowLevel.py
index 8002506..7311c75 100644
--- a/PyKCS11/LowLevel.py
+++ b/PyKCS11/LowLevel.py
@@ -1709,8 +1709,8 @@ class CPKCS11Lib(_object):
__swig_destroy__ = _LowLevel.delete_CPKCS11Lib
__del__ = lambda self: None
- def Load(self, szLib, bAutoCallInitialize):
- return _LowLevel.CPKCS11Lib_Load(self, szLib, bAutoCallInitialize)
+ def Load(self, szLib):
+ return _LowLevel.CPKCS11Lib_Load(self, szLib)
def Unload(self):
return _LowLevel.CPKCS11Lib_Unload(self)
diff --git a/PyKCS11/__init__.py b/PyKCS11/__init__.py
index b685c77..ccdd6bf 100644
--- a/PyKCS11/__init__.py
+++ b/PyKCS11/__init__.py
@@ -434,7 +434,11 @@ class PyKCS11Lib(object):
self.lib = PyKCS11.LowLevel.CPKCS11Lib()
def __del__(self):
- self.lib.Unload()
+ if PyKCS11 and PyKCS11.__name__ and \
+ PyKCS11.LowLevel and PyKCS11.LowLevel.__name__ and \
+ PyKCS11.LowLevel._LowLevel and \
+ PyKCS11.LowLevel._LowLevel.__name__:
+ self.lib.Unload()
def load(self, pkcs11dll_filename=None, *init_string):
"""
@@ -450,7 +454,7 @@ class PyKCS11Lib(object):
pkcs11dll_filename = os.getenv("PYKCS11LIB")
if pkcs11dll_filename is None:
raise PyKCS11Error(-1, "No PKCS11 library specified (set PYKCS11LIB env variable)")
- rv = self.lib.Load(pkcs11dll_filename, True)
+ rv = self.lib.Load(pkcs11dll_filename)
if rv == 0:
raise PyKCS11Error(-1, pkcs11dll_filename)
@@ -486,15 +490,19 @@ class PyKCS11Lib(object):
i.libraryVersion = (info.libraryVersion.major, info.libraryVersion.minor)
return i
- def getSlotList(self):
+ def getSlotList(self, tokenPresent=False):
"""
C_GetSlotList
+ @param tokenPresent: L{False} (default) to list all slots,
+ L{True} to list only slots with present tokens
+ @type tokenPresent: bool
@return: a list of available slots
@rtype: list
"""
slotList = PyKCS11.LowLevel.ckintlist()
- rv = self.lib.C_GetSlotList(0, slotList)
+ rv = self.lib.C_GetSlotList(CK_TRUE if tokenPresent else CK_FALSE,
+ slotList)
if rv != CKR_OK:
raise PyKCS11Error(rv)
@@ -705,8 +713,9 @@ class RSAOAEPMechanism(object):
def __init__(self, hash, mgf, label=None):
"""
- @param hash: the hash algorithm to use
- @param mfg: the mask generation function to use
+ @param hash: the hash algorithm to use (like L{CKM_SHA256})
+ @param mgf: the mask generation function to use (like
+ L{CKG_MGF1_SHA256})
@param label: the (optional) label to use
"""
self._param = PyKCS11.LowLevel.CK_RSA_PKCS_OAEP_PARAMS()
@@ -760,7 +769,7 @@ class DigestSession(object):
C_DigestKey
@param handle: key handle
- @type data: Handle
+ @type handle: CK_OBJECT_HANDLE
"""
rv = self._lib.C_DigestKey(self._session, handle)
if rv != CKR_OK:
diff --git a/readme.txt b/readme.txt
deleted file mode 100644
index 40927bb..0000000
--- a/readme.txt
+++ /dev/null
@@ -1,185 +0,0 @@
-========================================================================
- PyKCS11 - PKCS#11 Wrapper for Python - Project Overview
-========================================================================
-
-Authors
-"""""""
-
-- Copyright (C) 2004 Midori (midori -- a-t -- paipai dot net)
-- Copyright (C) 2006-2017 Ludovic Rousseau (ludovic.rousseau at free.fr)
-
-
-Licence
-"""""""
-
- This file is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-API
-"""
-The API documentation is available at http://pkcs11wrap.sourceforge.net/api/
-
-Unix Howto
-""""""""""
-To install::
-
- $ make build
- $ make install (or make install DESTDIR=/foo/bar)
-
-
-Windows Howto
-"""""""""""""
-
-Prerequisites
-
-* Install python3 (and add "C:\Python34;C:\Python34\Scripts" to PATH
- environment variable)
-* Install swig (and add swig install folder to PATH environment variable)
-* Install Visual studio 2010 SDK
-
-To install:
-
-Open "Visual Studio command prompt (2010)"
-
-cd to PyKCS11 folder and run::
-
- > nmake -f Makefile.win32 build
- > nmake -f Makefile.win32 install
-
-
-Known Bugs
-""""""""""
-
-If in Windows the linker complains that the Python24_d.lib doesn't exists
-Please edit the "SWIG-Install-Dir\Lib\python\python.swg" file and replace
-following line::
-
- #include "Python.h"
-
-with following code::
-
- #ifdef _DEBUG
- #undef _DEBUG
- #include "Python.h"
- #define _DEBUG
- #else
- #include "Python.h"
- #endif
-
-This prevents the linker to try to link against the debug version of python lib
-that doesn't come with the standard distribution.
-
-
-History
-"""""""
-
-1.4.1 - February 2017, Ludovic Rousseau
- - fix compilation under Python 3
- - add rsa encryption sample program
-
-1.4.0 - February 2017, Ludovic Rousseau
- - fix closeAllSessions() and move it Session to PKCS11Lib
- - add RSAOAEPMechanism to support RSA Encryption
- - add DigestSession which enables multi-part digesting
- - add Elliptic curve keypair generating mechanism
- - fix bug in Templates using booleans CK_TRUE/CK_FALSE
- Templates are used by generateKey(), generateKeyPair(),
- findObjects() createObject(), unwrapKey()
- - fix dumpit.py sample for Python 3
-
-1.3.3 - November 2016, Ludovic Rousseau
- - PKCS#11 definitions: sync with Cryptoki version 2.40
- . add missing CKM_* and CKP_* defines
- - Add generateKey() with default mechanism CKM_AES_KEY_GEN
- - Make sure the PyKCS11Lib is referenced as long as Session object is live
- - Fix OverflowError on Windows
- - Attribute CKA_WRAP_WITH_TRUSTED is bool
- - samples
- . dumpit: ask to enter the PIN on the pinpad if needed
- . getinfo & dumpit: add --slot= parameter
- - some minor improvements
-
-1.3.2 - January 2016, Ludovic Rousseau
- - Add wrappers for C_Verify, C_WrapKey, C_UnwrapKey
- - PKCS#11 definitions: sync with Cryptoki version 2.30
- - Generate CKM[CKM_VENDOR_DEFINED+x] values on the fly
- - Fix use of a pinpad reader CKF_PROTECTED_AUTHENTICATION_PATH
- - dumpit.py: lots of small fixes
- - Setup call make to build pykcs11_wrap.cpp using SWIG
- - Fix build on Windows
- - Small bugs fixed
-
-1.3.1 - October 2015, Ludovic Rousseau
- - PKCS#11 definitions: sync with Cryptoki version 2.30
- - Add user type CK_CONTEXT_SPECIFIC
- - Fixes #9, incorrect assignment of pParameter for CK_MECHANISMs.
- - CKA_DERIVE is a CK_BBOOL and not byte array
- - Add digest() and encrypt method to Session class
- - Add samples:
- . key-pair generation
- . key-pair generation + certificate import
- . printing public key modulus
- . computing signature
- - small bugs fixed
-
-1.3.0 - July 2014, Ludovic Rousseau
- - add Python3 support
-
-1.2.4 - April 2012, Ludovic Rousseau
- - improve epydoc documentation
- - add pinpad support in C_Login() using pin=None
- - add pinpad support in samples getinfo.py and dumpit.py
- - add createObject()
-
-1.2.3 - December 2010, Ludovic Rousseau
- - Add new classes CK_SLOT_INFO, CK_INFO, CK_SESSION_INFO,
- CK_MECHANISM_INFO and CK_TOKEN_INFO instead of the low level ones
- to have a __repr__() method. It is now possible to just print an
- object of these classes and have a human readable version.
- - Add a new class CK_OBJECT_HANDLE() to replace the low level one
- and have a __repr__() method for objects returned by findObjects()
- - Move initToken() from class Session to class PyKCS11Lib and add a
- slot parameter.
- - Add generateKeyPair and destoryObject support in high level
- interface
-
-1.2.2 - June 2010, Ludovic Rousseau
- Debug low level C_GenerateRandom
- Add seedRandom() and generateRandom() in the high level API
-
-1.2.1 - November 2008, Ludovic Rousseau
- Use src/opensc/pkcs11.h instead of src/rsaref/* files since the
- files from RSA are not free enough (no right to distribute modified
- versions for example)
- improve samples/getinfo.py script
- bug fixes
-
-1.2.0 - August 2008, Ludovic Rousseau
- add getMechanismList() and getMechanismInfo()
- add Session().getSessionInfo()
- bug fixes
-
-1.1.1 - December 2006, Giuseppe Amato (Midori)
- bug fixes
-
-1.1.0 - August 2006, Ludovic Rousseau
- Introduce high level API
-
-1.0.2 - July 2006, Ludovic Rousseau
- port to Unix (tested on GNU/Linux only)
- explicit call to SWIG to generate the wrapper
-
-1.0.1 - 2004 Giuseppe Amato (Midori)
- first version
- Windows only
diff --git a/samples/LowLevel/InitTokenPin.py b/samples/LowLevel/InitTokenPin.py
index 67d4deb..c33a0a6 100755
--- a/samples/LowLevel/InitTokenPin.py
+++ b/samples/LowLevel/InitTokenPin.py
@@ -19,11 +19,14 @@
from __future__ import print_function
import PyKCS11.LowLevel
+import os
a = PyKCS11.LowLevel.CPKCS11Lib()
info = PyKCS11.LowLevel.CK_INFO()
slotInfo = PyKCS11.LowLevel.CK_SLOT_INFO()
-lib = "pkcs11_lib.dll"
+lib = os.getenv("PYKCS11LIB")
+if lib == None:
+ raise(Exception("Define PYKCS11LIB"))
session = PyKCS11.LowLevel.CK_SESSION_HANDLE()
sessionInfo = PyKCS11.LowLevel.CK_SESSION_INFO()
tokenInfo = PyKCS11.LowLevel.CK_TOKEN_INFO()
@@ -32,7 +35,7 @@ pin = "123456"
puk = "12345678"
Label = "PyKCS#11 Initialized Token "
-print("Load of " + lib + ": " + str(a.Load(lib, True)))
+print("Load of " + lib + ": " + str(a.Load(lib)))
print("C_GetInfo: " + hex(a.C_GetInfo(info)))
print("Library manufacturerID: " + info.GetManufacturerID())
del info
diff --git a/samples/LowLevel/dumpit.py b/samples/LowLevel/dumpit.py
index d40e60d..e88caf2 100755
--- a/samples/LowLevel/dumpit.py
+++ b/samples/LowLevel/dumpit.py
@@ -20,18 +20,21 @@
from __future__ import print_function
from PyKCS11.LowLevel import *
+import os
a = CPKCS11Lib()
info = CK_INFO()
slotInfo = CK_SLOT_INFO()
-lib = "incryptoki2.dll"
+lib = os.getenv("PYKCS11LIB")
+if lib == None:
+ raise(Exception("Define PYKCS11LIB"))
session = CK_SESSION_HANDLE()
sessionInfo = CK_SESSION_INFO()
tokenInfo = CK_TOKEN_INFO()
slotList = ckintlist()
pin = "12345678"
-print("Load of " + lib + ": " + str(a.Load(lib, True)))
+print("Load of " + lib + ": " + str(a.Load(lib)))
print("C_GetInfo:", hex(a.C_GetInfo(info)))
print("Library manufacturerID:", info.GetManufacturerID())
del info
diff --git a/samples/LowLevel/rand.py b/samples/LowLevel/rand.py
index 2f321aa..327cbb7 100755
--- a/samples/LowLevel/rand.py
+++ b/samples/LowLevel/rand.py
@@ -19,17 +19,20 @@
from __future__ import print_function
import PyKCS11.LowLevel
+import os
a = PyKCS11.LowLevel.CPKCS11Lib()
info = PyKCS11.LowLevel.CK_INFO()
slotInfo = PyKCS11.LowLevel.CK_SLOT_INFO()
-lib = "/usr/lib/pkcs11/opensc-pkcs11.so"
+lib = os.getenv("PYKCS11LIB")
+if lib == None:
+ raise(Exception("Define PYKCS11LIB"))
session = PyKCS11.LowLevel.CK_SESSION_HANDLE()
slotList = PyKCS11.LowLevel.ckintlist()
rand = PyKCS11.LowLevel.ckbytelist(20)
seed = PyKCS11.LowLevel.ckbytelist(5)
-print("Load of " + lib + ": " + str(a.Load(lib, True)))
+print("Load of " + lib + ": " + str(a.Load(lib)))
print("C_GetInfo: " + hex(a.C_GetInfo(info)))
print("Library manufacturerID: " + info.GetManufacturerID())
del info
diff --git a/samples/LowLevel/test.py b/samples/LowLevel/test.py
index 445aa77..c06c3e7 100755
--- a/samples/LowLevel/test.py
+++ b/samples/LowLevel/test.py
@@ -19,18 +19,21 @@
from __future__ import print_function
import PyKCS11.LowLevel
+import os
a = PyKCS11.LowLevel.CPKCS11Lib()
info = PyKCS11.LowLevel.CK_INFO()
slotInfo = PyKCS11.LowLevel.CK_SLOT_INFO()
-lib = "incryptoki2.dll"
+lib = os.getenv("PYKCS11LIB")
+if lib == None:
+ raise(Exception("Define PYKCS11LIB"))
session = PyKCS11.LowLevel.CK_SESSION_HANDLE()
sessionInfo = PyKCS11.LowLevel.CK_SESSION_INFO()
tokenInfo = PyKCS11.LowLevel.CK_TOKEN_INFO()
slotList = PyKCS11.LowLevel.ckintlist()
pin = "12345678"
-print("Load of " + lib + ": " + str(a.Load(lib, True)))
+print("Load of " + lib + ": " + str(a.Load(lib)))
print("C_GetInfo: " + hex(a.C_GetInfo(info)))
print("Library manufacturerID: " + info.GetManufacturerID())
del info
diff --git a/samples/LowLevel/test1.py b/samples/LowLevel/test1.py
index ffd08e1..d21466f 100755
--- a/samples/LowLevel/test1.py
+++ b/samples/LowLevel/test1.py
@@ -19,18 +19,21 @@
from __future__ import print_function
import PyKCS11.LowLevel
+import os
a = PyKCS11.LowLevel.CPKCS11Lib()
info = PyKCS11.LowLevel.CK_INFO()
slotInfo = PyKCS11.LowLevel.CK_SLOT_INFO()
-lib = "/usr/lib/libopensc.so"
+lib = os.getenv("PYKCS11LIB")
+if lib == None:
+ raise(Exception("Define PYKCS11LIB"))
session = PyKCS11.LowLevel.CK_SESSION_HANDLE()
sessionInfo = PyKCS11.LowLevel.CK_SESSION_INFO()
tokenInfo = PyKCS11.LowLevel.CK_TOKEN_INFO()
slotList = PyKCS11.LowLevel.ckintlist()
pin = "1234"
-print("Load of " + lib + ": " + str(a.Load(lib, True)))
+print("Load of " + lib + ": " + str(a.Load(lib)))
print("C_GetInfo: " + hex(a.C_GetInfo(info)))
print("Library manufacturerID: " + info.GetManufacturerID())
del info
diff --git a/setup.py b/setup.py
index 52b31b1..8d6033c 100755
--- a/setup.py
+++ b/setup.py
@@ -55,7 +55,7 @@ else:
libraries_val = []
setup(name="PyKCS11",
- version="1.4.1",
+ version="1.4.2",
description="A Full PKCS#11 wrapper for Python",
keywords="crypto,pki,pkcs11,c++",
classifiers=classifiers,
@@ -65,7 +65,7 @@ setup(name="PyKCS11",
author_email="paipai at tiscali.it",
maintainer="Ludovic Rousseau",
maintainer_email="ludovic.rousseau at free.fr",
- url="https://bitbucket.org/PyKCS11/pykcs11",
+ url="https://github.com/LudovicRousseau/PyKCS11",
download_url="http://sourceforge.net/projects/pkcs11wrap/files/pykcs11/",
license="GPL",
ext_modules=[
diff --git a/src/pkcs11lib.cpp b/src/pkcs11lib.cpp
index ed8e7c2..e3827ce 100644
--- a/src/pkcs11lib.cpp
+++ b/src/pkcs11lib.cpp
@@ -51,7 +51,7 @@ CPKCS11Lib::~CPKCS11Lib(void)
Unload();
}
-bool CPKCS11Lib::Load(const char* szLib, bool bAutoCallInitialize)
+bool CPKCS11Lib::Load(const char* szLib)
{
CK_RV rv;
Unload();
@@ -73,16 +73,11 @@ bool CPKCS11Lib::Load(const char* szLib, bool bAutoCallInitialize)
return false;
}
- if (bAutoCallInitialize)
- {
- CK_INFO infos;
- if (m_pFunc->C_GetInfo(&infos) == CKR_CRYPTOKI_NOT_INITIALIZED)
- {
- m_bAutoInitialized = m_bFinalizeOnClose = CKR_OK == m_pFunc->C_Initialize(NULL);
- }
- else
- m_bAutoInitialized = true;
- }
+ rv = m_pFunc->C_Initialize(NULL);
+ if (CKR_OK != rv)
+ return false;
+
+ m_bFinalizeOnClose = true;
return true;
}
diff --git a/src/pkcs11lib.h b/src/pkcs11lib.h
index 143c126..3ecf44d 100644
--- a/src/pkcs11lib.h
+++ b/src/pkcs11lib.h
@@ -50,7 +50,7 @@ class CPKCS11Lib
public:
CPKCS11Lib(void);
~CPKCS11Lib(void);
- bool Load(const char* szLib, bool bAutoCallInitialize);
+ bool Load(const char* szLib);
bool Unload();
CK_RV C_Initialize();
diff --git a/src/pykcs11_wrap.cpp b/src/pykcs11_wrap.cpp
index 3b415d5..aa055df 100644
--- a/src/pykcs11_wrap.cpp
+++ b/src/pykcs11_wrap.cpp
@@ -16419,20 +16419,16 @@ SWIGINTERN PyObject *_wrap_CPKCS11Lib_Load(PyObject *SWIGUNUSEDPARM(self), PyObj
PyObject *resultobj = 0;
CPKCS11Lib *arg1 = (CPKCS11Lib *) 0 ;
char *arg2 = (char *) 0 ;
- bool arg3 ;
void *argp1 = 0 ;
int res1 = 0 ;
int res2 ;
char *buf2 = 0 ;
int alloc2 = 0 ;
- bool val3 ;
- int ecode3 = 0 ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
- PyObject * obj2 = 0 ;
bool result;
- if (!PyArg_ParseTuple(args,(char *)"OOO:CPKCS11Lib_Load",&obj0,&obj1,&obj2)) SWIG_fail;
+ if (!PyArg_ParseTuple(args,(char *)"OO:CPKCS11Lib_Load",&obj0,&obj1)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_CPKCS11Lib, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CPKCS11Lib_Load" "', argument " "1"" of type '" "CPKCS11Lib *""'");
@@ -16443,12 +16439,7 @@ SWIGINTERN PyObject *_wrap_CPKCS11Lib_Load(PyObject *SWIGUNUSEDPARM(self), PyObj
SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CPKCS11Lib_Load" "', argument " "2"" of type '" "char const *""'");
}
arg2 = reinterpret_cast< char * >(buf2);
- ecode3 = SWIG_AsVal_bool(obj2, &val3);
- if (!SWIG_IsOK(ecode3)) {
- SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "CPKCS11Lib_Load" "', argument " "3"" of type '" "bool""'");
- }
- arg3 = static_cast< bool >(val3);
- result = (bool)(arg1)->Load((char const *)arg2,arg3);
+ result = (bool)(arg1)->Load((char const *)arg2);
resultobj = SWIG_From_bool(static_cast< bool >(result));
if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
return resultobj;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/pykcs11.git
More information about the Python-modules-commits
mailing list