Hello Thomas, Thank you for your comments and help. I've updated the branch based on your work, but with changes... The password is secret, and there is a standard mechanism in openvpn to handle password... So I tried to use it.
For the conditionals, I wanted to get rid of the openssl engine conditionals... anyway, the conditionals is not for the ENGINE type as it does exists in 0.9.7 initial release. So I think that reducing use of conditionals is better for reading the code. Can you please re-test and comment? Thanks! Alon. On Mon, Jun 18, 2012 at 10:12 PM, Thomas Habets <tho...@habets.se> wrote: > I can confirm that it works. I need to specify both engine and > engine-pvk in the config though. If "engine" is not specified then > ENGINE_load_builtin_engines() is never called. If you had this in mind > then I think "engine-pvk" should require "engine". (just putting > "engine" in the config file is enough, without parameter) > > Other nits: > The call to ENGINE_load_private_key() should probably be surrounded by > #ifdef HAVE_OPENSSL_ENGINE. > > Presumably without HAVE_OPENSSL_ENGINE the ENGINE struct and > openssl/engine.h doesn't exist, so they should be #ifdeffed too. > > Fixed this, and added SRK password option, in attached patch to be > applied on top of your engine branch. If option is not given then the > default UI functions are called (for linux at console that means > prompt the user). > > (the SRK password is not really a secret. If you have it then you're > allowed to do operations with the TPM chip. But you have to supply > the tpm-sealed data when doing the operation. I've seen several > recommendations to just leave it blank) > > On 18 June 2012 15:22, Alon Bar-Lev <alon.bar...@gmail.com> wrote: >> Oh... >> And I forgot mentioning that the UI method should be solved, using the >> default is not something that is usable for openvpn. >> Can you please take care of this? >> >> Alon. >> >> On Mon, Jun 18, 2012 at 3:25 PM, Alon Bar-Lev <alon.bar...@gmail.com> wrote: >>> Hello Thomas, >>> >>> I did not have the global variable in mind :) >>> >>> I thought about your initial suggestion of specific private key >>> engine, and it has value, so I added a new option. >>> >>> I propose the following [1], the problem is that I cannot test this out. >>> >>> While looking on the current engine implementation, there is a need to >>> pass the pre/post strings, so there is more work to be done here, I >>> will do this later. >>> >>> I also don't understand the need of using the dynamic in >>> try_load_engine, but this will be resolved by supporting pre/post >>> strings. >>> >>> Please review and test, should reach the same functionality as you require. >>> >>> Regards, >>> Alon. >>> >>> [1] https://github.com/alonbl/openvpn/compare/master...engine >>> >>> On Mon, Jun 18, 2012 at 12:45 AM, Thomas Habets <tho...@habets.se> wrote: >>>> Those questions are why I'd prefer to reuse the already loaded ENGINE >>>> (engine_persist in crypto_openssl), but it didn't appear to be >>>> exported from the crypto backend (crypto_backend.h), which is why my >>>> previous patch added exporting of it (by means of the init function). >>>> >>>> All versions of the patch works with non-static modules. The TPM one >>>> I'm using is a .so file. >>>> http://packages.debian.org/squeeze/amd64/libengine-tpm-openssl/filelist >>>> >>>> Do you want a separate ENGINE struct or not? >>>> If same, how should it be exported from crypto_openssl to ssl_openssl? >>>> I don't see any non-static accessor. >>>> If different, call setup_engine() from ssl_openssl.c (meaning turning >>>> setup_engine() non-static)? >>>> >>>> I was hesitant to create new non-statics in crypto_openssl, but one >>>> easy solution is of course to just make >>>> crypto_openssl.c::engine_persist non-static and use it directly, as >>>> seen in attached patch. >>>> >>>> Seems I don't need to call ENGINE_init() at all. The attached patch >>>> works, at least. >>>> >>>> I appreciate the code discipline. Really I do. :-) >>>> >>>> Regards, >>>> Thomas >>>> >>>> On 17 June 2012 22:04, Alon Bar-Lev <alon.bar...@gmail.com> wrote: >>>>> Yes, almost :) >>>>> >>>>> Won't it better to call ENGINE_init at setup_engine() or at >>>>> try_load_engine() instead of at tls_ctx_load_priv_file()? It is just >>>>> that tls_ctx_load_priv_file() can be called more than once, while the >>>>> init should be called once, right? >>>>> Are you sure all works well if engine is not statically linked? >>>>> What about ENGINE_finish() at proper place? >>>>> >>>>> Thank you for your patience, >>>>> Alon Bar-Lev. >>>>> >>>>> >>>>> On Sun, Jun 17, 2012 at 11:53 PM, Thomas Habets <tho...@habets.se> wrote: >>>>>> Hi. >>>>>> >>>>>> Need? No. I thought you preferred reusing the loaded/inited ENGINE >>>>>> struct cached by existing code instead of creating a new one. >>>>>> >>>>>> Is the attached patch what you had in mind? >>>>>> >>>>>> (same description/sign-off) >>>>>> >>>>>> Regards, >>>>>> Thomas >>>>>> >>>>>> >>>>>> On 17 June 2012 12:12, Alon Bar-Lev <alon.bar...@gmail.com> wrote: >>>>>>> Hi, >>>>>>> >>>>>>> Why do we need to crypto_init_lib_engine() twice? Can you please take >>>>>>> a look at init_crypto_pre:: init_crypto_pre()? >>>>>>> >>>>>>> I also think crypto_init_lib_engine() should not return the engine... >>>>>>> as won't it simpler to use ENGINE_by_id() at >>>>>>> ssl_openssl.c::tls_ctx_load_priv_file()? >>>>>>> >>>>>>> Alon. >>>>>>> >>>>>>> On Sun, Jun 17, 2012 at 1:02 PM, Thomas Habets <tho...@habets.se> wrote: >>>>>>>> Hi. >>>>>>>> >>>>>>>> Ah yes, I first made the patch to an older version where some of these >>>>>>>> things don't apply, and then forward-ported it. >>>>>>>> >>>>>>>> How about this? >>>>>>>> --------- >>>>>>>> Add support for SSL engine loading the private key. >>>>>>>> >>>>>>>> Option 'engine' is used to specify the name of the engine that >>>>>>>> will load the private key. >>>>>>>> >>>>>>>> For example this can be "tpm" to use the OpenSSL TPM engine module >>>>>>>> (libengine-tpm-openssl in Debian). >>>>>>>> >>>>>>>> It defaults to the built-in UI methods because openssl-tpm-engine >>>>>>>> doesn't yet support user data being sent to the callback functions. >>>>>>>> A patch for that on its way to them. >>>>>>>> >>>>>>>> Some more details: >>>>>>>> http://blog.habets.pp.se/2012/02/TPM-backed-SSL >>>>>>>> >>>>>>>> Signed-off-by: Thomas Habets <hab...@google.com> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On 17 June 2012 01:11, Alon Bar-Lev <alon.bar...@gmail.com> wrote: >>>>>>>>> Hello, >>>>>>>>> >>>>>>>>> It is a good idea. >>>>>>>>> But first, please remove the emacs stuff. >>>>>>>>> >>>>>>>>> Now, I see that the ENGINE_load_builtin_engines() is already called at >>>>>>>>> crypto_openssl.c::crypto_init_lib_engine, is there any require to >>>>>>>>> duplicate this? >>>>>>>>> >>>>>>>>> There is already "engine" option, available only to polarssl, it can >>>>>>>>> easily and correct way be used also for openssl, instead of having >>>>>>>>> another option. >>>>>>>>> >>>>>>>>> What do you think? >>>>>>>>> Alon. >>>>>>>>> >>>>>>>>> >>>>>>>>> On Sun, Jun 17, 2012 at 2:50 AM, Thomas Habets <tho...@habets.se> >>>>>>>>> wrote: >>>>>>>>>> Patch attached. >>>>>>>>>> >>>>>>>>>> Add support for SSL engine loading the private key. >>>>>>>>>> >>>>>>>>>> Added option 'key-engine' specifying the name of the engine that >>>>>>>>>> will load the private key. >>>>>>>>>> >>>>>>>>>> For example this can be "tpm" to use the OpenSSL TPM engine module >>>>>>>>>> (libengine-tpm-openssl in Debian). >>>>>>>>>> >>>>>>>>>> It defaults to the built-in UI methods because openssl-tpm-engine >>>>>>>>>> doesn't yet support user data being sent to the callback functions. >>>>>>>>>> A patch for that on its way to them. >>>>>>>>>> >>>>>>>>>> Some more details: >>>>>>>>>> http://blog.habets.pp.se/2012/02/TPM-backed-SSL >>>>>>>>>> >>>>>>>>>> Signed-off-by: Thomas Habets <hab...@google.com> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> typedef struct me_s { >>>>>>>>>> char name[] = { "Thomas Habets" }; >>>>>>>>>> char email[] = { "tho...@habets.pp.se" }; >>>>>>>>>> char kernel[] = { "Linux" }; >>>>>>>>>> char *pgpKey[] = { "http://www.habets.pp.se/pubkey.txt" }; >>>>>>>>>> char pgp[] = { "A8A3 D1DD 4AE0 8467 7FDE 0945 286A E90A AD48 E854" >>>>>>>>>> }; >>>>>>>>>> char coolcmd[] = { "echo '. ./_&. ./_'>_;. ./_" }; >>>>>>>>>> } me_t; >>>>>>>>>> >>>>>>>>>> ------------------------------------------------------------------------------ >>>>>>>>>> Live Security Virtual Conference >>>>>>>>>> Exclusive live event will cover all the ways today's security and >>>>>>>>>> threat landscape has changed and how IT managers can respond. >>>>>>>>>> Discussions >>>>>>>>>> will include endpoint security, mobile security and the latest in >>>>>>>>>> malware >>>>>>>>>> threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ >>>>>>>>>> _______________________________________________ >>>>>>>>>> Openvpn-devel mailing list >>>>>>>>>> Openvpn-devel@lists.sourceforge.net >>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/openvpn-devel >>>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> typedef struct me_s { >>>>>>>> char name[] = { "Thomas Habets" }; >>>>>>>> char email[] = { "tho...@habets.pp.se" }; >>>>>>>> char kernel[] = { "Linux" }; >>>>>>>> char *pgpKey[] = { "http://www.habets.pp.se/pubkey.txt" }; >>>>>>>> char pgp[] = { "A8A3 D1DD 4AE0 8467 7FDE 0945 286A E90A AD48 E854" }; >>>>>>>> char coolcmd[] = { "echo '. ./_&. ./_'>_;. ./_" }; >>>>>>>> } me_t; >>>> >>>> >>>> >>>> -- >>>> typedef struct me_s { >>>> char name[] = { "Thomas Habets" }; >>>> char email[] = { "tho...@habets.pp.se" }; >>>> char kernel[] = { "Linux" }; >>>> char *pgpKey[] = { "http://www.habets.pp.se/pubkey.txt" }; >>>> char pgp[] = { "A8A3 D1DD 4AE0 8467 7FDE 0945 286A E90A AD48 E854" }; >>>> char coolcmd[] = { "echo '. ./_&. ./_'>_;. ./_" }; >>>> } me_t; > > > > -- > typedef struct me_s { > char name[] = { "Thomas Habets" }; > char email[] = { "tho...@habets.pp.se" }; > char kernel[] = { "Linux" }; > char *pgpKey[] = { "http://www.habets.pp.se/pubkey.txt" }; > char pgp[] = { "A8A3 D1DD 4AE0 8467 7FDE 0945 286A E90A AD48 E854" }; > char coolcmd[] = { "echo '. ./_&. ./_'>_;. ./_" }; > } me_t;