aheinecke@404: /* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik
aheinecke@404:  * Software engineering by Intevation GmbH
aheinecke@404:  *
aheinecke@404:  * This file is Free Software under the GNU GPL (v>=2)
aheinecke@404:  * and comes with ABSOLUTELY NO WARRANTY!
aheinecke@404:  * See LICENSE.txt for details.
aheinecke@404:  */
wilde@259: #include <stdlib.h>
wilde@259: 
wilde@259: #include "certhelp.h"
wilde@260: #include "logging.h"
wilde@259: #include "errorcodes.h"
wilde@259: #include "strhelp.h"
wilde@259: 
wilde@259: char *
wilde@259: get_oid_valstr(x509_name *namebuf, unsigned char *oid)
wilde@259: {
wilde@259:   char *str = NULL;
wilde@259:   size_t oid_len = strlen((char *)oid);
wilde@259:   while ( namebuf != NULL )
wilde@259:     {
wilde@259:       if ( (namebuf->oid.len == oid_len) &&
wilde@259:            (memcmp(namebuf->oid.p, oid, oid_len) == 0) )
wilde@259:         {
wilde@259:           str = xstrndup((char *)namebuf->val.p, namebuf->val.len);
wilde@259:           break;
wilde@259:         }
wilde@259:       namebuf = namebuf->next;
wilde@259:     }
wilde@259:   return str;
wilde@259: }
wilde@259: 
wilde@259: char *
wilde@259: x509_parse_subject(unsigned char *derdata, size_t derlen,
wilde@259:                    unsigned char *oid)
wilde@259: {
wilde@259:   x509_crt chain;
wilde@259:   char *str;
wilde@259: 
wilde@259:   x509_crt_init(&chain);
wilde@259:   if (x509_crt_parse_der(&chain, derdata, derlen) != 0)
wilde@259:     {
aheinecke@332:       ERRORPRINTF("Could not parse certificate!\n");
aheinecke@332:       return NULL;
wilde@259:     }
wilde@259:   else
wilde@259:     {
wilde@259:       str = get_oid_valstr(&(chain.subject), oid);
wilde@259:       x509_crt_free(&chain);
wilde@259:     }
wilde@259:   return str;
wilde@259: }