rodmarquez21 escribió:Que tal, oye te felicito, muy buen blog!, una duda, estoy desarrollando en .net y ya pude obtener lo key usage extensions (KeyAgreement, DataEncipherment, NonRepudiation, DigitalSignature), mi duda es cómo obtener el c0, o E8 o D8 para hacer más fácil la comparación... gracias!!
Pssss, eso te va a costar una botella de tequila....o por lo menos un six je je je.
En serio, me pase dos meses (checa la fecha de los post, desde el 1-nov al 1-ene) para descubrir esto que te voy a pasar:
El Key Usage (el "normal" no el extendido) es un word y cada bit tiene codificada su uso de la siguiente forma :
Código: Seleccionar todo
usage := getKeyUsageBits;
Result := '';
if (usage and 128) = 128 then Result := Result + 'digitalSignature ';
if (usage and 64) = 64 then Result := Result + 'nonRepudiation ';
if (usage and 32) = 32 then Result := Result + 'keyEncipherment ';
if (usage and 16) = 16 then Result := Result + 'dataEncipherment ';
if (usage and 8) = 8 then Result := Result + 'keyAgreement ';
if (usage and 4) = 4 then Result := Result + 'keyCertSign ';
if (usage and 2) = 2 then Result := Result + 'cRLSign ';
if (usage and 1) = 1 then Result := Result + 'encipherOnly ';
Si tienes una rutina "inversa" que por ejemplo que obtengas "keyCertSign" entonces debes prender el bit 2 (con valor 4) y asi sucesivamente
Ahora, el Key Usage
extended yo lo obtengo como cadenas de string, hay MILES de posibilidades de valores aqui, el OpenSSL reconoce algunos cuantos (los mas comunes) estos son valores OID del tipo 1.2.3.4.5.6.
Para saber si es una FIEL o un CSD hago una pre-calificacion (y por eso agradezco a la ayuda de los posts anteriores) ya que me han reportado que en general se cumple :
Código: Seleccionar todo
EsFIEL := 0; EsCSD := 0;
if (certificado.KeyUsage = $e8) or (certificado.KeyUsage = $d8) then EsFIEL := EsFIEL + 1;
if certificado.KeyUsage = $c0 then EsCSD := EsCSD + 1;
if pos('TLS Web Client Authentication',certificado.ExtKeyUsageTxt) > 0 then EsFIEL := EsFIEL + 1;
if certificado.ExtKeyUsageTxt = '' then EsCSD := EsCSD + 1; //El CSD NO TIENE Key Usage Extended, solo la tiene la FIEL
if EsFIEL > EsCSD then Result := tcFIEL;
if EsFIEL < EsCSD then Result := tcCSD;
if EsFIEL = EsCSD then Result := tcDESCONOCIDO;
Aqui lo que hago es inicializar dos variables "EsFiel" y "EsCSD" y segun lo que me han reportado voy asignado un "1" por cada vez que se cumple una condicion, al final veo cual tiene mas peso.