[xmlsec] xmlsec-mscrypto code review (patch #5) and todo list

Aleksey Sanin aleksey@aleksey.com
Tue, 23 Sep 2003 21:48:42 -0700


This is a multi-part message in MIME format.
--------------000505070809050705010009
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

 >   0) Generalized api for loading keys from memory
Done. Created "general" functions for
    - reading key from memory
    - reading cert into key from memory
    - reading pkcs12 blob from memory
    - reading cert into keys manager from memory
Creating NSS functions was a trivial (but boring :) ) task because
NSS implementation of these functions already did something like:
    - load from file into memory
    - do something with data in memory
But anyway, I would appreciate if Tej can take a look to make sure I did
not screw up something :(

Also I have introduced "NSS specific" errors handler that always prints
out the last NSS error code (similar to what I did in mscrypto).

The patch is checked in and you can find it attached.

Aleksey







--------------000505070809050705010009
Content-Type: application/gzip;
 name="read-from-memory.diff.gz"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="read-from-memory.diff.gz"

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
--------------000505070809050705010009--