Hi all, Thanks for the feedback. I was mostly concerned with the happy path at first, fixing memory management was on my list, but given it's the recurring comment, I am starting on that now. This is my first real C project, so your criticism is welcome.
Regarding the API, I can't simply expose the same API as the definition, since at least, there won't be the need to pass the various argument lengths in PHP land. Since I was going to change the API anyway, I thought it best to use the recommended code convention for class and method names. It is also in line with other languages PKCS11 implementations. One compromise I think is appropriate would be to provide the vanilla API as functions (as they are) taking a Pkcs11\Session object as the session handler. and leave it up to the user to choose how to use it. @vjardin, what do you think ? Regarding C_GetAttributeValue() return code, this is more of a design choice, since I absolutely despise passing a variable reference to be filled by the method, returning a partial result, along with an explanation would require some hoop jumping. Not impossible, but worth thinking it over. What I see is returning a new AttributeSet object, with isComplete(): bool (true if CKR_OK, false otherwise), and getError() returning the code. Not married to it though, I am open to suggestions. https://python-pkcs11.readthedocs.io/en/latest/applied.html https://godoc.org/github.com/miekg/pkcs11 Thank you for taking the time to comment. *Guillaume Amringerhttps://keybase.io/gamr <https://keybase.io/gamr>https://www.linkedin.com/in/guillaumeamringer <https://www.linkedin.com/in/guillaumeamringer>https://github.com/gamringer <https://github.com/gamringer>* On Mon, Jul 20, 2020 at 3:46 PM <vjar...@free.fr> wrote: > Hi Guillaume, > > same comments than Johannes, ecalloc()/efree()/emalloc() should be used. > Since they are many crypto sensitive contents, only ecalloc() should be > used (no emalloc()). > > Regarding the Oasis' semantic, I feel that it is important to keep it "as > is" so the vanilla documentation would be the upstream Oasis PKCS11 > standard. > It means, for instance: > getInfo() -> C_GetInfo() > > It is nice to have some sign() methods in order to avoid combining > C_SignInit() + C_Sign(), but they are some cases when we need to stick with > the Oasis' specifications, so I believe that > C_SignInit() > C_VerifyInit() > C_FindObjectsInit() > C_FindObjectsFinal() > etc. > should still be exposed per the Oasis' specification, along having some > nice sign(), verify(), etc. methods too. > > Regarding: > C_GetAttributeValue() > it has many "OK" cases: > See Oasis' comments: > "Note that the error codes CKR_ATTRIBUTE_SENSITIVE, > CKR_ATTRIBUTE_TYPE_INVALID, and CKR_BUFFER_TOO_SMALL do not denote true > errors for C_GetAttributeValue. If a call to C_GetAttributeValue returns > any of these three values, then the call MUST nonetheless have processed > every attribute in the template supplied to C_GetAttributeValue. Each > attribute in the template whose value can be returned by the call to > C_GetAttributeValue will be returned by the call to C_GetAttributeValue." > > my 2 cents, > Vincent > > ----- Mail original ----- > De: "Johannes Schlüter" <johan...@schlueters.de> > À: "Guillaume Amringer" <g.amrin...@gmail.com>, "pecl-dev" < > pecl-dev@lists.php.net> > Envoyé: Lundi 20 Juillet 2020 14:55:33 > Objet: Re: [PECL-DEV] PKCS11 Extension > > Hi, > > On Sun, 2020-07-19 at 22:33 -0400, Guillaume Amringer wrote: > > The extension is currently hosted here: > > https://github.com/gamringer/php-pkcs11 > > I scrolled over it without much attention (thus probably missed other > issues) a few comments to this line I noticed: > > pSlotList = (CK_SLOT_ID_PTR) malloc(ulSlotCount * sizeof(CK_SLOT_ID)); > https://github.com/gamringer/php-pkcs11/blob/master/pkcs11.c#L300 > > 1. The return value of malloc() is not checked. If the system runs out > of memory (OOM) or for some other reason can't return a memory block > this will return NULL and then lead to undefined behavior later. > (unlikely on today's systems, but might happen) > 2. emalloc should be used instead of malloc. For one it counts towards > PHP's memory_limit, ten it also ensures the memory is freed if > something weird happens by the end of the request, thus reduces risk > of memory leaks and it fixes point 1. by terminating the request in > an OOM situation. > 3. ulSlotCount * sizeof(CK_SLOT_ID) could eventually overflow. Better > use > safe_emalloc(ulSlotCount, sizeof(CK_SLOT_ID), 0) > this > calculates > ulSlotCount * sizeof(CK_SLOT_ID) + 0 > in a overflow-safe > way and errors out in case of a problem. > > johannes > > -- > PECL development discussion Mailing List (https://pecl.php.net/) > To unsubscribe, visit: https://www.php.net/unsub.php >