On Tue, Jun 19, 2012 at 2:20 AM, Thomas Habets <tho...@habets.se> wrote: > Should be noted that the prompt is now "Enter Private Key Password:" > instead of the engine-module generated "SRK authorization:".
Right. I can live with this... maybe in future the key names for all kind of keys will be modified... > But all is well because I can just send the SRK password as a command > to the module: > engine-pvk-cmd-post PIN "foo bar baz" Great! Always go with best practices when programming something... There is a reason for having best practices... :) Don't know when the engine was added and why it was added this way... > Just two small typos that need to be fixed, and I'm happy: > > diff --git a/src/openvpn/options.c b/src/openvpn/options.c > index be0bc7c..a8ccd54 100644 > --- a/src/openvpn/options.c > +++ b/src/openvpn/options.c > @@ -6470,7 +6470,7 @@ add_option (struct options *options, > VERIFY_PERMISSION (OPT_P_GENERAL); > > for (j = 1; j < MAX_PARMS && p[j] != NULL; j++) > - options->engine_cmd_pre[j-1] = strcmp(p[j], "(null)") ? p[j] : NULL; > + options->engine_cmd_post[j-1] = strcmp(p[j], "(null)") ? p[j] : NULL; > } > else if (streq (p[0], "engine-pvk") && p[1]) > { > @@ -6493,7 +6493,7 @@ add_option (struct options *options, > VERIFY_PERMISSION (OPT_P_GENERAL); > > for (j = 1; j < MAX_PARMS && p[j] != NULL; j++) > - options->engine_pvk_cmd_pre[j-1] = strcmp(p[j], "(null)") ? p[j] : > NULL; > + options->engine_pvk_cmd_post[j-1] = strcmp(p[j], "(null)") ? p[j] : > NULL > } > #endif /* ENABLE_CRYPTO_OPENSSL */ > #ifdef HAVE_EVP_CIPHER_CTX_SET_KEY_LENGTH > Right! Fixed. Thanks! > > >> >>> >>> I'm not an OpenSSL ninja, but this looks suspicious: >>> ------ >>> if (!ENGINE_init(e)) >>> msg (M_SSLERR, "Cannot initialize engine '%s'", engine); >>> >>> ENGINE_free(e); /* free +1 reference count of the above two */ >>> [... more uses of e ...] >>> ------ >>> Seems all the M_SSLERR lines there should set e=NULL and stop >>> processing, to keep the same behaviour. >> >> When msg with M_SSLERR is issued, the program terminates... >> --- >> #define M_SSLERR (M_FATAL | M_SSL) >> >> if (flags & M_FATAL) >> openvpn_exit (OPENVPN_EXIT_STATUS_ERROR); /* exit point */ >> ---- >> >>> But yes, it works. >> >> Thanks! >> Any more comments regarding engine usage and cleanups? >> >> Alon. >> >>> >>> On 18 June 2012 21:40, Alon Bar-Lev <alon.bar...@gmail.com> wrote: >>>> 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; >>> >>> >>> >>> -- >>> 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;