On 18 June 2012 23:40, Alon Bar-Lev <alon.bar...@gmail.com> wrote:
>> Shouldn't it on be the default?
> This is a very looooooooooooong argument... weather to allow unsecured
> setup by default...

[googled a bit for it. I see.]

Should be noted that the prompt is now "Enter Private Key Password:"
instead of the engine-module generated "SRK authorization:".

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"

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




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

Reply via email to