|
Packit Service |
3749ba |
/*
|
|
Packit Service |
3749ba |
* Copyright (C) 2011 Collabora Ltd.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Redistribution and use in source and binary forms, with or without
|
|
Packit Service |
3749ba |
* modification, are permitted provided that the following conditions
|
|
Packit Service |
3749ba |
* are met:
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* * Redistributions of source code must retain the above
|
|
Packit Service |
3749ba |
* copyright notice, this list of conditions and the
|
|
Packit Service |
3749ba |
* following disclaimer.
|
|
Packit Service |
3749ba |
* * Redistributions in binary form must reproduce the
|
|
Packit Service |
3749ba |
* above copyright notice, this list of conditions and
|
|
Packit Service |
3749ba |
* the following disclaimer in the documentation and/or
|
|
Packit Service |
3749ba |
* other materials provided with the distribution.
|
|
Packit Service |
3749ba |
* * The names of contributors to this software may not be
|
|
Packit Service |
3749ba |
* used to endorse or promote products derived from this
|
|
Packit Service |
3749ba |
* software without specific prior written permission.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
Packit Service |
3749ba |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
Packit Service |
3749ba |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
Packit Service |
3749ba |
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
Packit Service |
3749ba |
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
Packit Service |
3749ba |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
Packit Service |
3749ba |
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
Packit Service |
3749ba |
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
Packit Service |
3749ba |
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
Packit Service |
3749ba |
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
Packit Service |
3749ba |
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
|
Packit Service |
3749ba |
* DAMAGE.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Author: Stef Walter <stefw@collabora.co.uk>
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
#include "config.h"
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
#include "array.h"
|
|
Packit Service |
3749ba |
#include "attrs.h"
|
|
Packit Service |
3749ba |
#include "buffer.h"
|
|
Packit Service |
3749ba |
#define P11_DEBUG_FLAG P11_DEBUG_URI
|
|
Packit Service |
3749ba |
#include "debug.h"
|
|
Packit Service |
3749ba |
#include "message.h"
|
|
Packit Service |
3749ba |
#include "pkcs11.h"
|
|
Packit Service |
3749ba |
#include "private.h"
|
|
Packit Service |
3749ba |
#include "p11-kit.h"
|
|
Packit Service |
3749ba |
#include "uri.h"
|
|
Packit Service |
3749ba |
#include "url.h"
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
#include <assert.h>
|
|
Packit Service |
3749ba |
#include <ctype.h>
|
|
Packit Service |
3749ba |
#include <stdlib.h>
|
|
Packit Service |
3749ba |
#include <stdio.h>
|
|
Packit Service |
3749ba |
#include <string.h>
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* SECTION:p11-kit-uri
|
|
Packit Service |
3749ba |
* @title: URIs
|
|
Packit Service |
3749ba |
* @short_description: Parsing and formatting PKCS\#11 URIs
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* PKCS\#11 URIs can be used in configuration files or applications to represent
|
|
Packit Service |
3749ba |
* PKCS\#11 modules, tokens or objects. An example of a URI might be:
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* <literallayout>
|
|
Packit Service |
3749ba |
* pkcs11:token=The\%20Software\%20PKCS\#11\%20softtoken;
|
|
Packit Service |
3749ba |
* manufacturer=Snake\%20Oil,\%20Inc.;serial=;object=my-certificate;
|
|
Packit Service |
3749ba |
* model=1.0;type=cert;id=\%69\%95\%3e\%5c\%f4\%bd\%ec\%91
|
|
Packit Service |
3749ba |
* </literallayout>
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* You can use p11_kit_uri_parse() to parse such a URI, and p11_kit_uri_format()
|
|
Packit Service |
3749ba |
* to build one. URIs are represented by the #P11KitUri structure. You can match
|
|
Packit Service |
3749ba |
* a parsed URI against PKCS\#11 tokens with p11_kit_uri_match_token_info()
|
|
Packit Service |
3749ba |
* or attributes with p11_kit_uri_match_attributes().
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Since URIs can represent different sorts of things, when parsing or formatting
|
|
Packit Service |
3749ba |
* a URI a 'context' can be used to indicate which sort of URI is expected.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* URIs have an unrecognized flag. This flag is set during parsing
|
|
Packit Service |
3749ba |
* if any parts of the URI are not recognized. This may be because the part is
|
|
Packit Service |
3749ba |
* from a newer version of the PKCS\#11 spec or because that part was not valid
|
|
Packit Service |
3749ba |
* inside of the desired context used when parsing.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* P11KitUri:
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* A structure representing a PKCS\#11 URI. There are no public fields
|
|
Packit Service |
3749ba |
* visible in this structure. Use the various accessor functions.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* P11KitUriType:
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_FOR_OBJECT: The URI represents one or more objects
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_FOR_TOKEN: The URI represents one or more tokens
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_FOR_SLOT: The URI represents one or more slots
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_FOR_MODULE: The URI represents one or more modules
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_FOR_MODULE_WITH_VERSION: The URI represents a module with
|
|
Packit Service |
3749ba |
* a specific version.
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_FOR_OBJECT_ON_TOKEN: The URI represents one or more objects
|
|
Packit Service |
3749ba |
* that are present on a specific token.
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_FOR_OBJECT_ON_TOKEN_AND_MODULE: The URI represents one or more
|
|
Packit Service |
3749ba |
* objects that are present on a specific token, being used with a certain
|
|
Packit Service |
3749ba |
* module.
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_FOR_ANY: The URI can represent anything
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* A PKCS\#11 URI can represent different kinds of things. This flag is used by
|
|
Packit Service |
3749ba |
* p11_kit_uri_parse() to denote in what context the URI will be used.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* The various types can be combined.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* P11KitUriResult:
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_OK: Success
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_UNEXPECTED: Unexpected or internal system error
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_BAD_SCHEME: The URI had a bad scheme
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_BAD_ENCODING: The URI had a bad encoding
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_BAD_SYNTAX: The URI had a bad syntax
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_BAD_VERSION: The URI contained a bad version number
|
|
Packit Service |
3749ba |
* @P11_KIT_URI_NOT_FOUND: A requested part of the URI was not found
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Error codes returned by various functions. The functions each clearly state
|
|
Packit Service |
3749ba |
* which error codes they are capable of returning.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* P11_KIT_URI_NO_MEMORY:
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Unexpected memory allocation failure result. Same as #P11_KIT_URI_UNEXPECTED.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* P11_KIT_URI_SCHEME:
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* String of URI scheme for PKCS\#11 URIs.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* P11_KIT_URI_SCHEME_LEN:
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Length of %P11_KIT_URI_SCHEME.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
typedef struct _Attribute {
|
|
Packit Service |
3749ba |
char *name;
|
|
Packit Service |
3749ba |
char *value;
|
|
Packit Service |
3749ba |
} Attribute;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
struct p11_kit_uri {
|
|
Packit Service |
3749ba |
bool unrecognized;
|
|
Packit Service |
3749ba |
CK_INFO module;
|
|
Packit Service |
3749ba |
CK_SLOT_INFO slot;
|
|
Packit Service |
3749ba |
CK_TOKEN_INFO token;
|
|
Packit Service |
3749ba |
CK_ATTRIBUTE *attrs;
|
|
Packit Service |
3749ba |
CK_SLOT_ID slot_id;
|
|
Packit Service |
3749ba |
char *pin_source;
|
|
Packit Service |
3749ba |
char *pin_value;
|
|
Packit Service |
3749ba |
char *module_name;
|
|
Packit Service |
3749ba |
char *module_path;
|
|
Packit Service |
3749ba |
p11_array *qattrs;
|
|
Packit Service |
3749ba |
};
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static char *
|
|
Packit Service |
3749ba |
strip_whitespace (const char *value)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
size_t length = strlen (value);
|
|
Packit Service |
3749ba |
char *at, *pos;
|
|
Packit Service |
3749ba |
char *key;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
key = malloc (length + 1);
|
|
Packit Service |
3749ba |
return_val_if_fail (key != NULL, NULL);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
memcpy (key, value, length);
|
|
Packit Service |
3749ba |
key[length] = '\0';
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* Do we have any whitespace? Strip it out. */
|
|
Packit Service |
3749ba |
if (strcspn (key, P11_URL_WHITESPACE) != length) {
|
|
Packit Service |
3749ba |
for (at = key, pos = key; pos != key + length + 1; ++pos) {
|
|
Packit Service |
3749ba |
if (!strchr (P11_URL_WHITESPACE, *pos))
|
|
Packit Service |
3749ba |
*(at++) = *pos;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
*at = '\0';
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return key;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static bool
|
|
Packit Service |
3749ba |
match_struct_string (const unsigned char *inuri, const unsigned char *real,
|
|
Packit Service |
3749ba |
size_t length)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
assert (inuri);
|
|
Packit Service |
3749ba |
assert (real);
|
|
Packit Service |
3749ba |
assert (length > 0);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* NULL matches anything */
|
|
Packit Service |
3749ba |
if (inuri[0] == 0)
|
|
Packit Service |
3749ba |
return true;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return memcmp (inuri, real, length) == 0 ? true : false;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static bool
|
|
Packit Service |
3749ba |
match_struct_version (CK_VERSION const *inuri, CK_VERSION const *real)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
/* This matches anything */
|
|
Packit Service |
3749ba |
if (inuri->major == (CK_BYTE)-1 && inuri->minor == (CK_BYTE)-1)
|
|
Packit Service |
3749ba |
return true;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return memcmp (inuri, real, sizeof (CK_VERSION)) == 0 ? true : false;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_module_info:
|
|
Packit Service |
3749ba |
* @uri: the URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get the CK_INFO structure associated with this URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* If this is a parsed URI, then the fields corresponding to library parts of
|
|
Packit Service |
3749ba |
* the URI will be filled in. Any library URI parts that were missing will have
|
|
Packit Service |
3749ba |
* their fields filled with zeros.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* If the caller wishes to setup information for building a URI, then relevant
|
|
Packit Service |
3749ba |
* fields should be filled in. Fields that should not appear as parts in the
|
|
Packit Service |
3749ba |
* resulting URI should be filled with zeros.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: A pointer to the CK_INFO structure.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
CK_INFO_PTR
|
|
Packit Service |
3749ba |
p11_kit_uri_get_module_info (P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
return &uri->module;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_match_uri_module_info (CK_INFO const *one,
|
|
Packit Service |
3749ba |
CK_INFO const *two)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return (match_struct_string (one->libraryDescription,
|
|
Packit Service |
3749ba |
two->libraryDescription,
|
|
Packit Service |
3749ba |
sizeof (one->libraryDescription)) &&
|
|
Packit Service |
3749ba |
match_struct_string (one->manufacturerID,
|
|
Packit Service |
3749ba |
two->manufacturerID,
|
|
Packit Service |
3749ba |
sizeof (one->manufacturerID)) &&
|
|
Packit Service |
3749ba |
match_struct_version (&one->libraryVersion,
|
|
Packit Service |
3749ba |
&two->libraryVersion));
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_match_module_info:
|
|
Packit Service |
3749ba |
* @uri: the URI
|
|
Packit Service |
3749ba |
* @info: the structure to match against the URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Match a CK_INFO structure against the library parts of this URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Only the fields of the CK_INFO structure that are valid for use
|
|
Packit Service |
3749ba |
* in a URI will be matched. A URI part that was not specified in the URI will
|
|
Packit Service |
3749ba |
* match any value in the structure. If during the URI parsing any unrecognized
|
|
Packit Service |
3749ba |
* parts were encountered then this match will fail.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: 1 if the URI matches, 0 if not.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_kit_uri_match_module_info (const P11KitUri *uri, const CK_INFO *info)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, 0);
|
|
Packit Service |
3749ba |
return_val_if_fail (info != NULL, 0);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (uri->unrecognized)
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return p11_match_uri_module_info (&uri->module, info);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_slot_info:
|
|
Packit Service |
3749ba |
* @uri: the URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get the CK_SLOT_INFO structure associated with this URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* If this is a parsed URI, then the fields corresponding to slot parts of
|
|
Packit Service |
3749ba |
* the URI will be filled in. Any slot URI parts that were missing will have
|
|
Packit Service |
3749ba |
* their fields filled with zeros.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* If the caller wishes to setup information for building a URI, then relevant
|
|
Packit Service |
3749ba |
* fields should be filled in. Fields that should not appear as parts in the
|
|
Packit Service |
3749ba |
* resulting URI should be filled with zeros.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: A pointer to the CK_INFO structure.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
CK_SLOT_INFO_PTR
|
|
Packit Service |
3749ba |
p11_kit_uri_get_slot_info (P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
return &uri->slot;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_match_uri_slot_info (CK_SLOT_INFO const *one,
|
|
Packit Service |
3749ba |
CK_SLOT_INFO const *two)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return (match_struct_string (one->slotDescription,
|
|
Packit Service |
3749ba |
two->slotDescription,
|
|
Packit Service |
3749ba |
sizeof (one->slotDescription)) &&
|
|
Packit Service |
3749ba |
match_struct_string (one->manufacturerID,
|
|
Packit Service |
3749ba |
two->manufacturerID,
|
|
Packit Service |
3749ba |
sizeof (one->manufacturerID)));
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_match_slot_info:
|
|
Packit Service |
3749ba |
* @uri: the URI
|
|
Packit Service |
3749ba |
* @slot_info: the structure to match against the URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Match a CK_SLOT_INFO structure against the slot parts of this
|
|
Packit Service |
3749ba |
* URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Only the fields of the CK_SLOT_INFO structure that are valid
|
|
Packit Service |
3749ba |
* for use in a URI will be matched. A URI part that was not specified in the
|
|
Packit Service |
3749ba |
* URI will match any value in the structure. If during the URI parsing any
|
|
Packit Service |
3749ba |
* unrecognized parts were encountered then this match will fail.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: 1 if the URI matches, 0 if not.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_kit_uri_match_slot_info (const P11KitUri *uri, const CK_SLOT_INFO *slot_info)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, 0);
|
|
Packit Service |
3749ba |
return_val_if_fail (slot_info != NULL, 0);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (uri->unrecognized)
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return p11_match_uri_slot_info (&uri->slot, slot_info);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_slot_id:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get the 'slot-id' part of the URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: The slot-id or (CK_SLOT_ID)-1 if not set.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
CK_SLOT_ID
|
|
Packit Service |
3749ba |
p11_kit_uri_get_slot_id (P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, (CK_SLOT_ID)-1);
|
|
Packit Service |
3749ba |
return uri->slot_id;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_set_slot_id:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @slot_id: The new slot-id
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Set the 'slot-id' part of the URI.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
void
|
|
Packit Service |
3749ba |
p11_kit_uri_set_slot_id (P11KitUri *uri,
|
|
Packit Service |
3749ba |
CK_SLOT_ID slot_id)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_if_fail (uri != NULL);
|
|
Packit Service |
3749ba |
uri->slot_id = slot_id;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_token_info:
|
|
Packit Service |
3749ba |
* @uri: the URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get the CK_TOKEN_INFO structure associated with this URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* If this is a parsed URI, then the fields corresponding to token parts of
|
|
Packit Service |
3749ba |
* the URI will be filled in. Any token URI parts that were missing will have
|
|
Packit Service |
3749ba |
* their fields filled with zeros.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* If the caller wishes to setup information for building a URI, then relevant
|
|
Packit Service |
3749ba |
* fields should be filled in. Fields that should not appear as parts in the
|
|
Packit Service |
3749ba |
* resulting URI should be filled with zeros.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: A pointer to the CK_INFO structure.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
CK_TOKEN_INFO_PTR
|
|
Packit Service |
3749ba |
p11_kit_uri_get_token_info (P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
return &uri->token;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_match_uri_token_info (CK_TOKEN_INFO const *one,
|
|
Packit Service |
3749ba |
CK_TOKEN_INFO const *two)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return (match_struct_string (one->label,
|
|
Packit Service |
3749ba |
two->label,
|
|
Packit Service |
3749ba |
sizeof (one->label)) &&
|
|
Packit Service |
3749ba |
match_struct_string (one->manufacturerID,
|
|
Packit Service |
3749ba |
two->manufacturerID,
|
|
Packit Service |
3749ba |
sizeof (one->manufacturerID)) &&
|
|
Packit Service |
3749ba |
match_struct_string (one->model,
|
|
Packit Service |
3749ba |
two->model,
|
|
Packit Service |
3749ba |
sizeof (one->model)) &&
|
|
Packit Service |
3749ba |
match_struct_string (one->serialNumber,
|
|
Packit Service |
3749ba |
two->serialNumber,
|
|
Packit Service |
3749ba |
sizeof (one->serialNumber)));
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_match_token_info:
|
|
Packit Service |
3749ba |
* @uri: the URI
|
|
Packit Service |
3749ba |
* @token_info: the structure to match against the URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Match a CK_TOKEN_INFO structure against the token parts of this
|
|
Packit Service |
3749ba |
* URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Only the fields of the CK_TOKEN_INFO structure that are valid
|
|
Packit Service |
3749ba |
* for use in a URI will be matched. A URI part that was not specified in the
|
|
Packit Service |
3749ba |
* URI will match any value in the structure. If during the URI parsing any
|
|
Packit Service |
3749ba |
* unrecognized parts were encountered then this match will fail.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: 1 if the URI matches, 0 if not.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_kit_uri_match_token_info (const P11KitUri *uri, const CK_TOKEN_INFO *token_info)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, 0);
|
|
Packit Service |
3749ba |
return_val_if_fail (token_info != NULL, 0);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (uri->unrecognized)
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return p11_match_uri_token_info (&uri->token, token_info);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_attribute:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @attr_type: The attribute type
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get a pointer to an attribute present in this URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: A pointer to the attribute, or NULL if not present.
|
|
Packit Service |
3749ba |
* The attribute is owned by the URI and should not be freed.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
CK_ATTRIBUTE_PTR
|
|
Packit Service |
3749ba |
p11_kit_uri_get_attribute (P11KitUri *uri, CK_ATTRIBUTE_TYPE attr_type)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (uri->attrs == NULL)
|
|
Packit Service |
3749ba |
return NULL;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return p11_attrs_find (uri->attrs, attr_type);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_set_attribute:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @attr: The attribute to set
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Set an attribute on the URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Only attributes that map to parts in a PKCS\#11 URI will be accepted.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: %P11_KIT_URI_OK if the attribute was successfully set.
|
|
Packit Service |
3749ba |
* %P11_KIT_URI_NOT_FOUND if the attribute was not valid for a URI.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_kit_uri_set_attribute (P11KitUri *uri, CK_ATTRIBUTE_PTR attr)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
uri->attrs = p11_attrs_buildn (uri->attrs, attr, 1);
|
|
Packit Service |
3749ba |
return_val_if_fail (uri->attrs != NULL, P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return P11_KIT_URI_OK;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_clear_attribute:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @attr_type: The type of the attribute to clear
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Clear an attribute on the URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Only attributes that map to parts in a PKCS\#11 URI will be accepted.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: %P11_KIT_URI_OK if the attribute was successfully cleared.
|
|
Packit Service |
3749ba |
* %P11_KIT_URI_NOT_FOUND if the attribute was not valid for a URI.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_kit_uri_clear_attribute (P11KitUri *uri, CK_ATTRIBUTE_TYPE attr_type)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (attr_type != CKA_CLASS &&
|
|
Packit Service |
3749ba |
attr_type != CKA_LABEL &&
|
|
Packit Service |
3749ba |
attr_type != CKA_ID)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_NOT_FOUND;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (uri->attrs)
|
|
Packit Service |
3749ba |
p11_attrs_remove (uri->attrs, attr_type);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return P11_KIT_URI_OK;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_attribute_types:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @n_attrs: A location to store the number of attributes returned.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get the attributes present in this URI. The attributes and values are
|
|
Packit Service |
3749ba |
* owned by the URI. If the URI is modified, then the attributes that were
|
|
Packit Service |
3749ba |
* returned from this function will not remain consistent.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: The attributes for this URI. These are owned by the URI.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
CK_ATTRIBUTE_PTR
|
|
Packit Service |
3749ba |
p11_kit_uri_get_attributes (P11KitUri *uri, CK_ULONG_PTR n_attrs)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
static const CK_ATTRIBUTE terminator = { CKA_INVALID, NULL, 0UL };
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (!uri->attrs) {
|
|
Packit Service |
3749ba |
if (n_attrs)
|
|
Packit Service |
3749ba |
*n_attrs = 0;
|
|
Packit Service |
3749ba |
return (CK_ATTRIBUTE_PTR)&terminator;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (n_attrs)
|
|
Packit Service |
3749ba |
*n_attrs = p11_attrs_count (uri->attrs);
|
|
Packit Service |
3749ba |
return uri->attrs;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_kit_uri_set_attributes (P11KitUri *uri, CK_ATTRIBUTE_PTR attrs,
|
|
Packit Service |
3749ba |
CK_ULONG n_attrs)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
CK_ULONG i;
|
|
Packit Service |
3749ba |
int ret;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
p11_kit_uri_clear_attributes (uri);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
for (i = 0; i < n_attrs; i++) {
|
|
Packit Service |
3749ba |
ret = p11_kit_uri_set_attribute (uri, &attrs[i]);
|
|
Packit Service |
3749ba |
if (ret != P11_KIT_URI_OK && ret != P11_KIT_URI_NOT_FOUND)
|
|
Packit Service |
3749ba |
return ret;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return P11_KIT_URI_OK;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
void
|
|
Packit Service |
3749ba |
p11_kit_uri_clear_attributes (P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_if_fail (uri != NULL);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
p11_attrs_free (uri->attrs);
|
|
Packit Service |
3749ba |
uri->attrs = NULL;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_match_attributes:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @attrs: The attributes to match
|
|
Packit Service |
3749ba |
* @n_attrs: The number of attributes
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Match a attributes against the object parts of this URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Only the attributes that are valid for use in a URI will be matched. A URI
|
|
Packit Service |
3749ba |
* part that was not specified in the URI will match any attribute value. If
|
|
Packit Service |
3749ba |
* during the URI parsing any unrecognized parts were encountered then this
|
|
Packit Service |
3749ba |
* match will fail.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: 1 if the URI matches, 0 if not.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_kit_uri_match_attributes (const P11KitUri *uri, const CK_ATTRIBUTE *attrs,
|
|
Packit Service |
3749ba |
CK_ULONG n_attrs)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
CK_ATTRIBUTE *attr;
|
|
Packit Service |
3749ba |
CK_ULONG i;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, 0);
|
|
Packit Service |
3749ba |
return_val_if_fail (attrs != NULL || n_attrs == 0, 0);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (uri->unrecognized)
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
for (i = 0; i < n_attrs; i++) {
|
|
Packit Service |
3749ba |
if (attrs[i].type != CKA_CLASS &&
|
|
Packit Service |
3749ba |
attrs[i].type != CKA_LABEL &&
|
|
Packit Service |
3749ba |
attrs[i].type != CKA_ID)
|
|
Packit Service |
3749ba |
continue;
|
|
Packit Service |
3749ba |
attr = NULL;
|
|
Packit Service |
3749ba |
if (uri->attrs)
|
|
Packit Service |
3749ba |
attr = p11_attrs_find (uri->attrs, attrs[i].type);
|
|
Packit Service |
3749ba |
if (!attr)
|
|
Packit Service |
3749ba |
continue;
|
|
Packit Service |
3749ba |
if (!p11_attr_equal (attr, attrs + i))
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_set_unrecognized:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @unrecognized: The new unregognized flag value
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Set the unrecognized flag on this URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* The unrecognized flag is automatically set to 1 when during parsing any part
|
|
Packit Service |
3749ba |
* of the URI is unrecognized. If the unrecognized flag is set to 1, then
|
|
Packit Service |
3749ba |
* matching against this URI will always fail.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
void
|
|
Packit Service |
3749ba |
p11_kit_uri_set_unrecognized (P11KitUri *uri, int unrecognized)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_if_fail (uri != NULL);
|
|
Packit Service |
3749ba |
uri->unrecognized = unrecognized ? true : false;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_any_unrecognized:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get the unrecognized flag for this URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* The unrecognized flag is automatically set to 1 when during parsing any part
|
|
Packit Service |
3749ba |
* of the URI is unrecognized. If the unrecognized flag is set to 1, then
|
|
Packit Service |
3749ba |
* matching against this URI will always fail.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: 1 if unrecognized flag is set, 0 otherwise.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_kit_uri_any_unrecognized (P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, 1);
|
|
Packit Service |
3749ba |
return uri->unrecognized;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_pin_value:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get the 'pin-value' part of the URI. This is used by some applications to
|
|
Packit Service |
3749ba |
* read the PIN for logging into a PKCS\#11 token.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: The pin-value or %NULL if not present.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
const char*
|
|
Packit Service |
3749ba |
p11_kit_uri_get_pin_value (const P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
return uri->pin_value;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_set_pin_value:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @pin: The new pin-value
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Set the 'pin-value' part of the URI. This is used by some applications to
|
|
Packit Service |
3749ba |
* specify the PIN for logging into a PKCS\#11 token.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
void
|
|
Packit Service |
3749ba |
p11_kit_uri_set_pin_value (P11KitUri *uri, const char *pin)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_if_fail (uri != NULL);
|
|
Packit Service |
3749ba |
free (uri->pin_value);
|
|
Packit Service |
3749ba |
uri->pin_value = pin ? strdup (pin) : NULL;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_pin_source:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get the 'pin-source' part of the URI. This is used by some applications to
|
|
Packit Service |
3749ba |
* lookup a PIN for logging into a PKCS\#11 token.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: The pin-source or %NULL if not present.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
const char*
|
|
Packit Service |
3749ba |
p11_kit_uri_get_pin_source (const P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
return uri->pin_source;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_pinfile:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Deprecated: use p11_kit_uri_get_pin_source().
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
const char*
|
|
Packit Service |
3749ba |
p11_kit_uri_get_pinfile (const P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
return p11_kit_uri_get_pin_source (uri);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_set_pin_source:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @pin_source: The new pin-source
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Set the 'pin-source' part of the URI. This is used by some applications to
|
|
Packit Service |
3749ba |
* lookup a PIN for logging into a PKCS\#11 token.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
void
|
|
Packit Service |
3749ba |
p11_kit_uri_set_pin_source (P11KitUri *uri, const char *pin_source)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_if_fail (uri != NULL);
|
|
Packit Service |
3749ba |
free (uri->pin_source);
|
|
Packit Service |
3749ba |
uri->pin_source = pin_source ? strdup (pin_source) : NULL;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_set_pinfile:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @pinfile: The pinfile
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Deprecated: use p11_kit_uri_set_pin_source().
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
void
|
|
Packit Service |
3749ba |
p11_kit_uri_set_pinfile (P11KitUri *uri, const char *pinfile)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_if_fail (uri != NULL);
|
|
Packit Service |
3749ba |
p11_kit_uri_set_pin_source (uri, pinfile);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_module_name:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get the 'module-name' part of the URI. This is used by some
|
|
Packit Service |
3749ba |
* applications to explicitly specify the name of a PKCS\#11 module.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: The module-name or %NULL if not present.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
const char*
|
|
Packit Service |
3749ba |
p11_kit_uri_get_module_name (const P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
return uri->module_name;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_set_module_name:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @name: The new module-name
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Set the 'module-name' part of the URI. This is used by some
|
|
Packit Service |
3749ba |
* applications to explicitly specify the name of a PKCS\#11 module.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
void
|
|
Packit Service |
3749ba |
p11_kit_uri_set_module_name (P11KitUri *uri, const char *name)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_if_fail (uri != NULL);
|
|
Packit Service |
3749ba |
free (uri->module_name);
|
|
Packit Service |
3749ba |
uri->module_name = name ? strdup (name) : NULL;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_module_path:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get the 'module-path' part of the URI. This is used by some
|
|
Packit Service |
3749ba |
* applications to explicitly specify the path of a PKCS\#11 module.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: The module-path or %NULL if not present.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
const char*
|
|
Packit Service |
3749ba |
p11_kit_uri_get_module_path (const P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
return uri->module_path;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_set_module_path:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @path: The new module-path
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Set the 'module-path' part of the URI. This is used by some
|
|
Packit Service |
3749ba |
* applications to explicitly specify the path of a PKCS\#11 module.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
void
|
|
Packit Service |
3749ba |
p11_kit_uri_set_module_path (P11KitUri *uri, const char *path)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return_if_fail (uri != NULL);
|
|
Packit Service |
3749ba |
free (uri->module_path);
|
|
Packit Service |
3749ba |
uri->module_path = path ? strdup (path) : NULL;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_get_vendor_query:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @name: The name of vendor query
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Get the vendor query part of the URI, identified by @name. This is
|
|
Packit Service |
3749ba |
* used by some applications to explicitly specify the path of a
|
|
Packit Service |
3749ba |
* PKCS\#11 module.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: The value of vendor query or %NULL if not present.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
const char*
|
|
Packit Service |
3749ba |
p11_kit_uri_get_vendor_query (const P11KitUri *uri, const char *name)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
size_t i;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
for (i = 0; i < uri->qattrs->num; i++) {
|
|
Packit Service |
3749ba |
Attribute *attr = uri->qattrs->elem[i];
|
|
Packit Service |
3749ba |
if (strcmp (attr->name, name) == 0)
|
|
Packit Service |
3749ba |
return attr->value;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
return NULL;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static void
|
|
Packit Service |
3749ba |
free_attribute (Attribute *attr)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
free (attr->name);
|
|
Packit Service |
3749ba |
free (attr->value);
|
|
Packit Service |
3749ba |
free (attr);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static bool
|
|
Packit Service |
3749ba |
insert_attribute (p11_array *attrs, char *name, char *value)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
Attribute *attr;
|
|
Packit Service |
3749ba |
size_t i;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return_val_if_fail (attrs != NULL, false);
|
|
Packit Service |
3749ba |
return_val_if_fail (name != NULL, false);
|
|
Packit Service |
3749ba |
return_val_if_fail (value != NULL, false);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
for (i = 0; i < attrs->num; i++) {
|
|
Packit Service |
3749ba |
attr = attrs->elem[i];
|
|
Packit Service |
3749ba |
if (strcmp (attr->name, (char *)name) > 0)
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
attr = calloc (1, sizeof (Attribute));
|
|
Packit Service |
3749ba |
return_val_if_fail (attr, false);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
attr->name = name;
|
|
Packit Service |
3749ba |
attr->value = value;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return p11_array_insert (attrs, i, attr);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_set_vendor_query:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
* @name: The name of vendor query
|
|
Packit Service |
3749ba |
* @value: (allow-none): The value of vendor query
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Set the vendor query part of the URI, identified by @name. This is
|
|
Packit Service |
3749ba |
* used by some applications to explicitly specify the path of a
|
|
Packit Service |
3749ba |
* PKCS\#11 module.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: 1 if the vendor query is set or removed, 0 if not.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_kit_uri_set_vendor_query (P11KitUri *uri, const char *name,
|
|
Packit Service |
3749ba |
const char *value)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
Attribute *attr;
|
|
Packit Service |
3749ba |
size_t i;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, 0);
|
|
Packit Service |
3749ba |
return_val_if_fail (name != NULL, 0);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
for (i = 0; i < uri->qattrs->num; i++) {
|
|
Packit Service |
3749ba |
attr = uri->qattrs->elem[i];
|
|
Packit Service |
3749ba |
if (strcmp (attr->name, name) == 0)
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
if (i == uri->qattrs->num) {
|
|
Packit Service |
3749ba |
if (value == NULL)
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
return insert_attribute (uri->qattrs,
|
|
Packit Service |
3749ba |
strdup (name), strdup (value));
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
if (value == NULL)
|
|
Packit Service |
3749ba |
p11_array_remove (uri->qattrs, i);
|
|
Packit Service |
3749ba |
else {
|
|
Packit Service |
3749ba |
free (attr->value);
|
|
Packit Service |
3749ba |
attr->value = strdup (value);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_new:
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Create a new blank PKCS\#11 URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* The new URI is in the right state to parse a string into. All relevant fields
|
|
Packit Service |
3749ba |
* are zeroed out. Formatting this URI will produce a valid but empty URI.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: A newly allocated URI. This should be freed with p11_kit_uri_free().
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
P11KitUri*
|
|
Packit Service |
3749ba |
p11_kit_uri_new (void)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
P11KitUri *uri;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
uri = calloc (1, sizeof (P11KitUri));
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* So that it matches anything */
|
|
Packit Service |
3749ba |
uri->module.libraryVersion.major = (CK_BYTE)-1;
|
|
Packit Service |
3749ba |
uri->module.libraryVersion.minor = (CK_BYTE)-1;
|
|
Packit Service |
3749ba |
uri->slot_id = (CK_SLOT_ID)-1;
|
|
Packit Service |
3749ba |
uri->qattrs = p11_array_new ((p11_destroyer)free_attribute);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return uri;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
enum uri_sep {
|
|
Packit Service |
3749ba |
sep_path = '\0',
|
|
Packit Service |
3749ba |
sep_pattr = ';',
|
|
Packit Service |
3749ba |
sep_query = '?',
|
|
Packit Service |
3749ba |
sep_qattr = '&',
|
|
Packit Service |
3749ba |
};
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static void
|
|
Packit Service |
3749ba |
format_name_equals (p11_buffer *buffer,
|
|
Packit Service |
3749ba |
enum uri_sep *sep,
|
|
Packit Service |
3749ba |
const char *name)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
if (*sep) {
|
|
Packit Service |
3749ba |
char c = *sep;
|
|
Packit Service |
3749ba |
p11_buffer_add (buffer, &c, 1);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
p11_buffer_add (buffer, name, -1);
|
|
Packit Service |
3749ba |
p11_buffer_add (buffer, "=", 1);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (*sep == sep_path)
|
|
Packit Service |
3749ba |
*sep = sep_pattr;
|
|
Packit Service |
3749ba |
else if (*sep == sep_query)
|
|
Packit Service |
3749ba |
*sep = sep_qattr;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static bool
|
|
Packit Service |
3749ba |
format_raw_string (p11_buffer *buffer,
|
|
Packit Service |
3749ba |
enum uri_sep *sep,
|
|
Packit Service |
3749ba |
const char *name,
|
|
Packit Service |
3749ba |
const char *value)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
/* Not set */
|
|
Packit Service |
3749ba |
if (!value)
|
|
Packit Service |
3749ba |
return true;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
format_name_equals (buffer, sep, name);
|
|
Packit Service |
3749ba |
p11_buffer_add (buffer, value, -1);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return p11_buffer_ok (buffer);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static bool
|
|
Packit Service |
3749ba |
format_encode_string (p11_buffer *buffer,
|
|
Packit Service |
3749ba |
enum uri_sep *sep,
|
|
Packit Service |
3749ba |
const char *name,
|
|
Packit Service |
3749ba |
const unsigned char *value,
|
|
Packit Service |
3749ba |
size_t n_value,
|
|
Packit Service |
3749ba |
bool force)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
/* Not set */
|
|
Packit Service |
3749ba |
if (!value)
|
|
Packit Service |
3749ba |
return true;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
format_name_equals (buffer, sep, name);
|
|
Packit Service |
3749ba |
p11_url_encode (value, value + n_value, force ? "" : P11_URL_VERBATIM, buffer);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return p11_buffer_ok (buffer);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static bool
|
|
Packit Service |
3749ba |
format_struct_string (p11_buffer *buffer,
|
|
Packit Service |
3749ba |
enum uri_sep *sep,
|
|
Packit Service |
3749ba |
const char *name,
|
|
Packit Service |
3749ba |
const unsigned char *value,
|
|
Packit Service |
3749ba |
size_t value_max)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
size_t len;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* Not set */
|
|
Packit Service |
3749ba |
if (!value[0])
|
|
Packit Service |
3749ba |
return true;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
len = p11_kit_space_strlen (value, value_max);
|
|
Packit Service |
3749ba |
return format_encode_string (buffer, sep, name, value, len, false);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static bool
|
|
Packit Service |
3749ba |
format_attribute_string (p11_buffer *buffer,
|
|
Packit Service |
3749ba |
enum uri_sep *sep,
|
|
Packit Service |
3749ba |
const char *name,
|
|
Packit Service |
3749ba |
CK_ATTRIBUTE_PTR attr,
|
|
Packit Service |
3749ba |
bool force)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
/* Not set */;
|
|
Packit Service |
3749ba |
if (attr == NULL)
|
|
Packit Service |
3749ba |
return true;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return format_encode_string (buffer, sep, name,
|
|
Packit Service |
3749ba |
attr->pValue, attr->ulValueLen,
|
|
Packit Service |
3749ba |
force);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static bool
|
|
Packit Service |
3749ba |
format_attribute_class (p11_buffer *buffer,
|
|
Packit Service |
3749ba |
enum uri_sep *sep,
|
|
Packit Service |
3749ba |
const char *name,
|
|
Packit Service |
3749ba |
CK_ATTRIBUTE_PTR attr)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
CK_OBJECT_CLASS klass;
|
|
Packit Service |
3749ba |
const char *value;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* Not set */;
|
|
Packit Service |
3749ba |
if (attr == NULL)
|
|
Packit Service |
3749ba |
return true;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
klass = *((CK_OBJECT_CLASS*)attr->pValue);
|
|
Packit Service |
3749ba |
switch (klass) {
|
|
Packit Service |
3749ba |
case CKO_DATA:
|
|
Packit Service |
3749ba |
value = "data";
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
case CKO_SECRET_KEY:
|
|
Packit Service |
3749ba |
value = "secret-key";
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
case CKO_CERTIFICATE:
|
|
Packit Service |
3749ba |
value = "cert";
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
case CKO_PUBLIC_KEY:
|
|
Packit Service |
3749ba |
value = "public";
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
case CKO_PRIVATE_KEY:
|
|
Packit Service |
3749ba |
value = "private";
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
default:
|
|
Packit Service |
3749ba |
return true;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return format_raw_string (buffer, sep, name, value);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static bool
|
|
Packit Service |
3749ba |
format_struct_version (p11_buffer *buffer,
|
|
Packit Service |
3749ba |
enum uri_sep *sep,
|
|
Packit Service |
3749ba |
const char *name,
|
|
Packit Service |
3749ba |
CK_VERSION_PTR version)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
char buf[64];
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* Not set */
|
|
Packit Service |
3749ba |
if (version->major == (CK_BYTE)-1 && version->minor == (CK_BYTE)-1)
|
|
Packit Service |
3749ba |
return true;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
snprintf (buf, sizeof (buf), "%d.%d",
|
|
Packit Service |
3749ba |
(int)version->major, (int)version->minor);
|
|
Packit Service |
3749ba |
return format_raw_string (buffer, sep, name, buf);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static bool
|
|
Packit Service |
3749ba |
format_ulong (p11_buffer *buffer,
|
|
Packit Service |
3749ba |
enum uri_sep *sep,
|
|
Packit Service |
3749ba |
const char *name,
|
|
Packit Service |
3749ba |
CK_ULONG value)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
char buf[64];
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* Not set */
|
|
Packit Service |
3749ba |
if (value == (CK_ULONG)-1)
|
|
Packit Service |
3749ba |
return true;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
snprintf (buf, sizeof (buf), "%lu", value);
|
|
Packit Service |
3749ba |
return format_raw_string (buffer, sep, name, buf);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_format:
|
|
Packit Service |
3749ba |
* @uri: The URI.
|
|
Packit Service |
3749ba |
* @uri_type: The type of URI that should be produced.
|
|
Packit Service |
3749ba |
* @string: Location to store a newly allocated string.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Format a PKCS\#11 URI into a string.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Fields which are zeroed out will not be included in the resulting string.
|
|
Packit Service |
3749ba |
* Attributes which are not present will also not be included.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* The uri_type of URI specified limits the different parts of the resulting
|
|
Packit Service |
3749ba |
* URI. To format a URI containing all possible information use
|
|
Packit Service |
3749ba |
* %P11_KIT_URI_FOR_ANY
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* It's up to the caller to guarantee that the attributes set in @uri are
|
|
Packit Service |
3749ba |
* those appropriate for inclusion in a URI, specifically:
|
|
Packit Service |
3749ba |
* <literal>CKA_ID</literal>, <literal>CKA_LABEL</literal>
|
|
Packit Service |
3749ba |
* and <literal>CKA_CLASS</literal>. The class must be one of
|
|
Packit Service |
3749ba |
* <literal>CKO_DATA</literal>, <literal>CKO_SECRET_KEY</literal>,
|
|
Packit Service |
3749ba |
* <literal>CKO_CERTIFICATE</literal>, <literal>CKO_PUBLIC_KEY</literal>,
|
|
Packit Service |
3749ba |
* <literal>CKO_PRIVATE_KEY</literal>.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* The resulting string should be freed with free().
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: %P11_KIT_URI_OK if the URI was formatted successfully,
|
|
Packit Service |
3749ba |
* %P11_KIT_URI_UNEXPECTED if the data in @uri is invalid for a URI.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_kit_uri_format (P11KitUri *uri, P11KitUriType uri_type, char **string)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
p11_buffer buffer;
|
|
Packit Service |
3749ba |
enum uri_sep sep = sep_path;
|
|
Packit Service |
3749ba |
size_t i;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return_val_if_fail (uri != NULL, P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
return_val_if_fail (string != NULL, P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (!p11_buffer_init_null (&buffer, 64))
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
p11_buffer_add (&buffer, P11_KIT_URI_SCHEME, P11_KIT_URI_SCHEME_LEN);
|
|
Packit Service |
3749ba |
p11_buffer_add (&buffer, ":", 1);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if ((uri_type & P11_KIT_URI_FOR_MODULE) == P11_KIT_URI_FOR_MODULE) {
|
|
Packit Service |
3749ba |
if (!format_struct_string (&buffer, &sep, "library-description",
|
|
Packit Service |
3749ba |
uri->module.libraryDescription,
|
|
Packit Service |
3749ba |
sizeof (uri->module.libraryDescription)) ||
|
|
Packit Service |
3749ba |
!format_struct_string (&buffer, &sep, "library-manufacturer",
|
|
Packit Service |
3749ba |
uri->module.manufacturerID,
|
|
Packit Service |
3749ba |
sizeof (uri->module.manufacturerID))) {
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if ((uri_type & P11_KIT_URI_FOR_MODULE_WITH_VERSION) == P11_KIT_URI_FOR_MODULE_WITH_VERSION) {
|
|
Packit Service |
3749ba |
if (!format_struct_version (&buffer, &sep, "library-version",
|
|
Packit Service |
3749ba |
&uri->module.libraryVersion)) {
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if ((uri_type & P11_KIT_URI_FOR_SLOT) == P11_KIT_URI_FOR_SLOT) {
|
|
Packit Service |
3749ba |
if (!format_struct_string (&buffer, &sep, "slot-description",
|
|
Packit Service |
3749ba |
uri->slot.slotDescription,
|
|
Packit Service |
3749ba |
sizeof (uri->slot.slotDescription)) ||
|
|
Packit Service |
3749ba |
!format_struct_string (&buffer, &sep, "slot-manufacturer",
|
|
Packit Service |
3749ba |
uri->slot.manufacturerID,
|
|
Packit Service |
3749ba |
sizeof (uri->slot.manufacturerID)) ||
|
|
Packit Service |
3749ba |
!format_ulong (&buffer, &sep, "slot-id",
|
|
Packit Service |
3749ba |
uri->slot_id)) {
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if ((uri_type & P11_KIT_URI_FOR_TOKEN) == P11_KIT_URI_FOR_TOKEN) {
|
|
Packit Service |
3749ba |
if (!format_struct_string (&buffer, &sep, "model",
|
|
Packit Service |
3749ba |
uri->token.model,
|
|
Packit Service |
3749ba |
sizeof (uri->token.model)) ||
|
|
Packit Service |
3749ba |
!format_struct_string (&buffer, &sep, "manufacturer",
|
|
Packit Service |
3749ba |
uri->token.manufacturerID,
|
|
Packit Service |
3749ba |
sizeof (uri->token.manufacturerID)) ||
|
|
Packit Service |
3749ba |
!format_struct_string (&buffer, &sep, "serial",
|
|
Packit Service |
3749ba |
uri->token.serialNumber,
|
|
Packit Service |
3749ba |
sizeof (uri->token.serialNumber)) ||
|
|
Packit Service |
3749ba |
!format_struct_string (&buffer, &sep, "token",
|
|
Packit Service |
3749ba |
uri->token.label,
|
|
Packit Service |
3749ba |
sizeof (uri->token.label))) {
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if ((uri_type & P11_KIT_URI_FOR_OBJECT) == P11_KIT_URI_FOR_OBJECT) {
|
|
Packit Service |
3749ba |
if (!format_attribute_string (&buffer, &sep, "id",
|
|
Packit Service |
3749ba |
p11_kit_uri_get_attribute (uri, CKA_ID),
|
|
Packit Service |
3749ba |
true) ||
|
|
Packit Service |
3749ba |
!format_attribute_string (&buffer, &sep, "object",
|
|
Packit Service |
3749ba |
p11_kit_uri_get_attribute (uri, CKA_LABEL),
|
|
Packit Service |
3749ba |
false)) {
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (!format_attribute_class (&buffer, &sep, "type",
|
|
Packit Service |
3749ba |
p11_kit_uri_get_attribute (uri, CKA_CLASS))) {
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
sep = sep_query;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (uri->pin_source) {
|
|
Packit Service |
3749ba |
if (!format_encode_string (&buffer, &sep, "pin-source",
|
|
Packit Service |
3749ba |
(const unsigned char*)uri->pin_source,
|
|
Packit Service |
3749ba |
strlen (uri->pin_source), 0)) {
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (uri->pin_value) {
|
|
Packit Service |
3749ba |
if (!format_encode_string (&buffer, &sep, "pin-value",
|
|
Packit Service |
3749ba |
(const unsigned char*)uri->pin_value,
|
|
Packit Service |
3749ba |
strlen (uri->pin_value), 0)) {
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (uri->module_name) {
|
|
Packit Service |
3749ba |
if (!format_encode_string (&buffer, &sep, "module-name",
|
|
Packit Service |
3749ba |
(const unsigned char*)uri->module_name,
|
|
Packit Service |
3749ba |
strlen (uri->module_name), 0)) {
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (uri->module_path) {
|
|
Packit Service |
3749ba |
if (!format_encode_string (&buffer, &sep, "module-path",
|
|
Packit Service |
3749ba |
(const unsigned char*)uri->module_path,
|
|
Packit Service |
3749ba |
strlen (uri->module_path), 0)) {
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
for (i = 0; i < uri->qattrs->num; i++) {
|
|
Packit Service |
3749ba |
Attribute *attr = uri->qattrs->elem[i];
|
|
Packit Service |
3749ba |
if (!format_encode_string (&buffer, &sep, attr->name,
|
|
Packit Service |
3749ba |
(const unsigned char *) attr->value,
|
|
Packit Service |
3749ba |
strlen (attr->value), 0)) {
|
|
Packit Service |
3749ba |
return_val_if_reached (P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return_val_if_fail (p11_buffer_ok (&buffer), P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
*string = p11_buffer_steal (&buffer, NULL);
|
|
Packit Service |
3749ba |
return P11_KIT_URI_OK;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static bool
|
|
Packit Service |
3749ba |
str_range_equal (const char *input, const char *start, const char *end)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
return strlen (input) == end - start &&
|
|
Packit Service |
3749ba |
memcmp (input, start, end - start) == 0;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_string_attribute (const char *name_start, const char *name_end,
|
|
Packit Service |
3749ba |
const char *start, const char *end,
|
|
Packit Service |
3749ba |
P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
unsigned char *value;
|
|
Packit Service |
3749ba |
CK_ATTRIBUTE_TYPE type;
|
|
Packit Service |
3749ba |
size_t length;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
assert (name_start <= name_end);
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (str_range_equal ("id", name_start, name_end))
|
|
Packit Service |
3749ba |
type = CKA_ID;
|
|
Packit Service |
3749ba |
else if (str_range_equal ("object", name_start, name_end))
|
|
Packit Service |
3749ba |
type = CKA_LABEL;
|
|
Packit Service |
3749ba |
else
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
value = p11_url_decode (start, end, P11_URL_WHITESPACE, &length);
|
|
Packit Service |
3749ba |
if (value == NULL)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_ENCODING;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
uri->attrs = p11_attrs_take (uri->attrs, type, value, length);
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_class_attribute (const char *name_start, const char *name_end,
|
|
Packit Service |
3749ba |
const char *start, const char *end,
|
|
Packit Service |
3749ba |
P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
CK_OBJECT_CLASS klass = 0;
|
|
Packit Service |
3749ba |
CK_ATTRIBUTE attr;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
assert (name_start <= name_end);
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (!str_range_equal ("objecttype", name_start, name_end) &&
|
|
Packit Service |
3749ba |
!str_range_equal ("object-type", name_start, name_end) &&
|
|
Packit Service |
3749ba |
!str_range_equal ("type", name_start, name_end))
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (str_range_equal ("cert", start, end))
|
|
Packit Service |
3749ba |
klass = CKO_CERTIFICATE;
|
|
Packit Service |
3749ba |
else if (str_range_equal ("public", start, end))
|
|
Packit Service |
3749ba |
klass = CKO_PUBLIC_KEY;
|
|
Packit Service |
3749ba |
else if (str_range_equal ("private", start, end))
|
|
Packit Service |
3749ba |
klass = CKO_PRIVATE_KEY;
|
|
Packit Service |
3749ba |
else if (str_range_equal ("secretkey", start, end))
|
|
Packit Service |
3749ba |
klass = CKO_SECRET_KEY;
|
|
Packit Service |
3749ba |
else if (str_range_equal ("secret-key", start, end))
|
|
Packit Service |
3749ba |
klass = CKO_SECRET_KEY;
|
|
Packit Service |
3749ba |
else if (str_range_equal ("data", start, end))
|
|
Packit Service |
3749ba |
klass = CKO_DATA;
|
|
Packit Service |
3749ba |
else {
|
|
Packit Service |
3749ba |
uri->unrecognized = true;
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
attr.pValue = &klass;
|
|
Packit Service |
3749ba |
attr.ulValueLen = sizeof (klass);
|
|
Packit Service |
3749ba |
attr.type = CKA_CLASS;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
uri->attrs = p11_attrs_build (uri->attrs, &attr, NULL);
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_struct_info (unsigned char *where, size_t length, const char *start,
|
|
Packit Service |
3749ba |
const char *end, P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
unsigned char *value;
|
|
Packit Service |
3749ba |
size_t value_length;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
value = p11_url_decode (start, end, P11_URL_WHITESPACE, &value_length);
|
|
Packit Service |
3749ba |
if (value == NULL)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_ENCODING;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* Too long, shouldn't match anything */
|
|
Packit Service |
3749ba |
if (value_length > length) {
|
|
Packit Service |
3749ba |
free (value);
|
|
Packit Service |
3749ba |
uri->unrecognized = true;
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
memset (where, ' ', length);
|
|
Packit Service |
3749ba |
memcpy (where, value, value_length);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
free (value);
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_token_info (const char *name_start, const char *name_end,
|
|
Packit Service |
3749ba |
const char *start, const char *end,
|
|
Packit Service |
3749ba |
P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
unsigned char *where;
|
|
Packit Service |
3749ba |
size_t length;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
assert (name_start <= name_end);
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (str_range_equal ("model", name_start, name_end)) {
|
|
Packit Service |
3749ba |
where = uri->token.model;
|
|
Packit Service |
3749ba |
length = sizeof (uri->token.model);
|
|
Packit Service |
3749ba |
} else if (str_range_equal ("manufacturer", name_start, name_end)) {
|
|
Packit Service |
3749ba |
where = uri->token.manufacturerID;
|
|
Packit Service |
3749ba |
length = sizeof (uri->token.manufacturerID);
|
|
Packit Service |
3749ba |
} else if (str_range_equal ("serial", name_start, name_end)) {
|
|
Packit Service |
3749ba |
where = uri->token.serialNumber;
|
|
Packit Service |
3749ba |
length = sizeof (uri->token.serialNumber);
|
|
Packit Service |
3749ba |
} else if (str_range_equal ("token", name_start, name_end)) {
|
|
Packit Service |
3749ba |
where = uri->token.label;
|
|
Packit Service |
3749ba |
length = sizeof (uri->token.label);
|
|
Packit Service |
3749ba |
} else {
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return parse_struct_info (where, length, start, end, uri);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static long
|
|
Packit Service |
3749ba |
atoin (const char *start, const char *end)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
long ret = 0;
|
|
Packit Service |
3749ba |
while (start != end) {
|
|
Packit Service |
3749ba |
if (*start < '0' || *start > '9')
|
|
Packit Service |
3749ba |
return -1;
|
|
Packit Service |
3749ba |
ret *= 10;
|
|
Packit Service |
3749ba |
ret += (*start - '0');
|
|
Packit Service |
3749ba |
++start;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
return ret;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_struct_version (const char *start, const char *end, CK_VERSION_PTR version)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
const char *dot;
|
|
Packit Service |
3749ba |
int val;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
dot = memchr (start, '.', end - start);
|
|
Packit Service |
3749ba |
if (!dot)
|
|
Packit Service |
3749ba |
dot = end;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (dot == start)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_VERSION;
|
|
Packit Service |
3749ba |
val = atoin (start, dot);
|
|
Packit Service |
3749ba |
if (val < 0 || val >= 255)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_VERSION;
|
|
Packit Service |
3749ba |
version->major = (CK_BYTE)val;
|
|
Packit Service |
3749ba |
version->minor = 0;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (dot != end) {
|
|
Packit Service |
3749ba |
if (dot + 1 == end)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_VERSION;
|
|
Packit Service |
3749ba |
val = atoin (dot + 1, end);
|
|
Packit Service |
3749ba |
if (val < 0 || val >= 255)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_VERSION;
|
|
Packit Service |
3749ba |
version->minor = (CK_BYTE)val;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_slot_info (const char *name_start, const char *name_end,
|
|
Packit Service |
3749ba |
const char *start, const char *end,
|
|
Packit Service |
3749ba |
P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
unsigned char *where;
|
|
Packit Service |
3749ba |
size_t length;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
assert (name_start <= name_end);
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (str_range_equal ("slot-description", name_start, name_end)) {
|
|
Packit Service |
3749ba |
where = uri->slot.slotDescription;
|
|
Packit Service |
3749ba |
length = sizeof (uri->slot.slotDescription);
|
|
Packit Service |
3749ba |
} else if (str_range_equal ("slot-manufacturer", name_start, name_end)) {
|
|
Packit Service |
3749ba |
where = uri->slot.manufacturerID;
|
|
Packit Service |
3749ba |
length = sizeof (uri->slot.manufacturerID);
|
|
Packit Service |
3749ba |
} else {
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return parse_struct_info (where, length, start, end, uri);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_slot_id (const char *name_start, const char *name_end,
|
|
Packit Service |
3749ba |
const char *start, const char *end,
|
|
Packit Service |
3749ba |
P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
assert (name_start <= name_end);
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (str_range_equal ("slot-id", name_start, name_end)) {
|
|
Packit Service |
3749ba |
long val;
|
|
Packit Service |
3749ba |
val = atoin (start, end);
|
|
Packit Service |
3749ba |
if (val < 0)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_SYNTAX;
|
|
Packit Service |
3749ba |
uri->slot_id = (CK_SLOT_ID)val;
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_module_version_info (const char *name_start, const char *name_end,
|
|
Packit Service |
3749ba |
const char *start, const char *end,
|
|
Packit Service |
3749ba |
P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
assert (name_start <= name_end);
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (str_range_equal ("library-version", name_start, name_end))
|
|
Packit Service |
3749ba |
return parse_struct_version (start, end,
|
|
Packit Service |
3749ba |
&uri->module.libraryVersion);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_module_info (const char *name_start, const char *name_end,
|
|
Packit Service |
3749ba |
const char *start, const char *end,
|
|
Packit Service |
3749ba |
P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
unsigned char *where;
|
|
Packit Service |
3749ba |
size_t length;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
assert (name_start <= name_end);
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (str_range_equal ("library-description", name_start, name_end)) {
|
|
Packit Service |
3749ba |
where = uri->module.libraryDescription;
|
|
Packit Service |
3749ba |
length = sizeof (uri->module.libraryDescription);
|
|
Packit Service |
3749ba |
} else if (str_range_equal ("library-manufacturer", name_start, name_end)) {
|
|
Packit Service |
3749ba |
where = uri->module.manufacturerID;
|
|
Packit Service |
3749ba |
length = sizeof (uri->module.manufacturerID);
|
|
Packit Service |
3749ba |
} else {
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return parse_struct_info (where, length, start, end, uri);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_pin_query (const char *name_start, const char *name_end,
|
|
Packit Service |
3749ba |
const char *start, const char *end,
|
|
Packit Service |
3749ba |
P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
unsigned char *value;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
assert (name_start <= name_end);
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (str_range_equal ("pinfile", name_start, name_end) ||
|
|
Packit Service |
3749ba |
str_range_equal ("pin-source", name_start, name_end)) {
|
|
Packit Service |
3749ba |
value = p11_url_decode (start, end, P11_URL_WHITESPACE, NULL);
|
|
Packit Service |
3749ba |
if (value == NULL)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_ENCODING;
|
|
Packit Service |
3749ba |
free (uri->pin_source);
|
|
Packit Service |
3749ba |
uri->pin_source = (char*)value;
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
} else if (str_range_equal ("pin-value", name_start, name_end)) {
|
|
Packit Service |
3749ba |
value = p11_url_decode (start, end, P11_URL_WHITESPACE, NULL);
|
|
Packit Service |
3749ba |
if (value == NULL)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_ENCODING;
|
|
Packit Service |
3749ba |
free (uri->pin_value);
|
|
Packit Service |
3749ba |
uri->pin_value = (char*)value;
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_module_query (const char *name_start, const char *name_end,
|
|
Packit Service |
3749ba |
const char *start, const char *end,
|
|
Packit Service |
3749ba |
P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
unsigned char *value;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
assert (name_start <= name_end);
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (str_range_equal ("module-name", name_start, name_end)) {
|
|
Packit Service |
3749ba |
value = p11_url_decode (start, end, P11_URL_WHITESPACE, NULL);
|
|
Packit Service |
3749ba |
if (value == NULL)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_ENCODING;
|
|
Packit Service |
3749ba |
free (uri->module_name);
|
|
Packit Service |
3749ba |
uri->module_name = (char*)value;
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
} else if (str_range_equal ("module-path", name_start, name_end)) {
|
|
Packit Service |
3749ba |
value = p11_url_decode (start, end, P11_URL_WHITESPACE, NULL);
|
|
Packit Service |
3749ba |
if (value == NULL)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_ENCODING;
|
|
Packit Service |
3749ba |
free (uri->module_path);
|
|
Packit Service |
3749ba |
uri->module_path = (char*)value;
|
|
Packit Service |
3749ba |
return 1;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
static int
|
|
Packit Service |
3749ba |
parse_vendor_query (const char *name_start, const char *name_end,
|
|
Packit Service |
3749ba |
const char *start, const char *end,
|
|
Packit Service |
3749ba |
P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
char *name;
|
|
Packit Service |
3749ba |
unsigned char *value;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
assert (name_start <= name_end);
|
|
Packit Service |
3749ba |
assert (start <= end);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
name = malloc (name_end - name_start + 1);
|
|
Packit Service |
3749ba |
if (name == NULL)
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_ENCODING;
|
|
Packit Service |
3749ba |
memcpy (name, name_start, name_end - name_start);
|
|
Packit Service |
3749ba |
name[name_end - name_start] = '\0';
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* Limit the characters in NAME, according to the specification. */
|
|
Packit Service |
3749ba |
if (strspn (name, "abcdefghijklmnopqrstuvwxyz0123456789-_") !=
|
|
Packit Service |
3749ba |
name_end - name_start) {
|
|
Packit Service |
3749ba |
free (name);
|
|
Packit Service |
3749ba |
return P11_KIT_URI_UNEXPECTED;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
value = p11_url_decode (start, end, P11_URL_WHITESPACE, NULL);
|
|
Packit Service |
3749ba |
if (value == NULL) {
|
|
Packit Service |
3749ba |
free (name);
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_ENCODING;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (!insert_attribute (uri->qattrs, name, (char *)value)) {
|
|
Packit Service |
3749ba |
free (name);
|
|
Packit Service |
3749ba |
free (value);
|
|
Packit Service |
3749ba |
return P11_KIT_URI_UNEXPECTED;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
return 0;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_parse:
|
|
Packit Service |
3749ba |
* @string: The string to parse
|
|
Packit Service |
3749ba |
* @uri_type: The type of URI that is expected
|
|
Packit Service |
3749ba |
* @uri: The blank URI to parse the values into
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Parse a PKCS\#11 URI string.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* PKCS\#11 URIs can represent tokens, objects or modules. The uri_type argument
|
|
Packit Service |
3749ba |
* allows the caller to specify what type of URI is expected and the sorts of
|
|
Packit Service |
3749ba |
* things the URI should match. %P11_KIT_URI_FOR_ANY can be used to parse a URI
|
|
Packit Service |
3749ba |
* for any context. It's then up to the caller to make sense of the way that
|
|
Packit Service |
3749ba |
* it is used.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* If the PKCS\#11 URI contains unrecognized URI parts or parts not applicable
|
|
Packit Service |
3749ba |
* to the specified context, then the unrecognized flag will be set. This will
|
|
Packit Service |
3749ba |
* prevent the URI from matching using the various match functions.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: %P11_KIT_URI_OK if the URI was parsed successfully.
|
|
Packit Service |
3749ba |
* %P11_KIT_URI_BAD_SCHEME if this was not a PKCS\#11 URI.
|
|
Packit Service |
3749ba |
* %P11_KIT_URI_BAD_SYNTAX if the URI syntax was bad.
|
|
Packit Service |
3749ba |
* %P11_KIT_URI_BAD_VERSION if a version number was bad.
|
|
Packit Service |
3749ba |
* %P11_KIT_URI_BAD_ENCODING if the URI encoding was invalid.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
int
|
|
Packit Service |
3749ba |
p11_kit_uri_parse (const char *string, P11KitUriType uri_type,
|
|
Packit Service |
3749ba |
P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
const char *spos, *epos;
|
|
Packit Service |
3749ba |
int ret;
|
|
Packit Service |
3749ba |
size_t length, i;
|
|
Packit Service |
3749ba |
char *allocated = NULL;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
assert (string);
|
|
Packit Service |
3749ba |
assert (uri);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* If STRING contains any whitespace, create a copy of the
|
|
Packit Service |
3749ba |
* string and strip it out */
|
|
Packit Service |
3749ba |
length = strcspn (string, P11_URL_WHITESPACE);
|
|
Packit Service |
3749ba |
if (strspn (string + length, P11_URL_WHITESPACE) > 0) {
|
|
Packit Service |
3749ba |
allocated = strip_whitespace (string);
|
|
Packit Service |
3749ba |
return_val_if_fail (allocated != NULL, P11_KIT_URI_UNEXPECTED);
|
|
Packit Service |
3749ba |
string = allocated;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
epos = strchr (string, ':');
|
|
Packit Service |
3749ba |
if (epos == NULL) {
|
|
Packit Service |
3749ba |
free (allocated);
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_SCHEME;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
if (epos - string != P11_KIT_URI_SCHEME_LEN) {
|
|
Packit Service |
3749ba |
free (allocated);
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_SCHEME;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
for (i = 0; i < P11_KIT_URI_SCHEME_LEN; i++)
|
|
Packit Service |
3749ba |
if (p11_ascii_tolower (string[i]) != P11_KIT_URI_SCHEME[i])
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
if (i != P11_KIT_URI_SCHEME_LEN) {
|
|
Packit Service |
3749ba |
free (allocated);
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_SCHEME;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
string = epos + 1;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* Clear everything out */
|
|
Packit Service |
3749ba |
memset (&uri->module, 0, sizeof (uri->module));
|
|
Packit Service |
3749ba |
memset (&uri->token, 0, sizeof (uri->token));
|
|
Packit Service |
3749ba |
p11_attrs_free (uri->attrs);
|
|
Packit Service |
3749ba |
uri->attrs = NULL;
|
|
Packit Service |
3749ba |
uri->module.libraryVersion.major = (CK_BYTE)-1;
|
|
Packit Service |
3749ba |
uri->module.libraryVersion.minor = (CK_BYTE)-1;
|
|
Packit Service |
3749ba |
uri->unrecognized = 0;
|
|
Packit Service |
3749ba |
uri->slot_id = (CK_SLOT_ID)-1;
|
|
Packit Service |
3749ba |
free (uri->pin_source);
|
|
Packit Service |
3749ba |
uri->pin_source = NULL;
|
|
Packit Service |
3749ba |
free (uri->pin_value);
|
|
Packit Service |
3749ba |
uri->pin_value = NULL;
|
|
Packit Service |
3749ba |
free (uri->module_name);
|
|
Packit Service |
3749ba |
uri->module_name = NULL;
|
|
Packit Service |
3749ba |
free (uri->module_path);
|
|
Packit Service |
3749ba |
uri->module_path = NULL;
|
|
Packit Service |
3749ba |
p11_array_clear (uri->qattrs);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* Parse the path. */
|
|
Packit Service |
3749ba |
for (;;) {
|
|
Packit Service |
3749ba |
spos = string + strcspn (string, ";?");
|
|
Packit Service |
3749ba |
if (spos == string)
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
epos = strchr (string, '=');
|
|
Packit Service |
3749ba |
if (epos == NULL || epos == string || epos >= spos) {
|
|
Packit Service |
3749ba |
free (allocated);
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_SYNTAX;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
ret = 0;
|
|
Packit Service |
3749ba |
if ((uri_type & P11_KIT_URI_FOR_OBJECT) == P11_KIT_URI_FOR_OBJECT)
|
|
Packit Service |
3749ba |
ret = parse_string_attribute (string, epos, epos + 1, spos, uri);
|
|
Packit Service |
3749ba |
if (ret == 0 && (uri_type & P11_KIT_URI_FOR_OBJECT) == P11_KIT_URI_FOR_OBJECT)
|
|
Packit Service |
3749ba |
ret = parse_class_attribute (string, epos, epos + 1, spos, uri);
|
|
Packit Service |
3749ba |
if (ret == 0 && (uri_type & P11_KIT_URI_FOR_TOKEN) == P11_KIT_URI_FOR_TOKEN)
|
|
Packit Service |
3749ba |
ret = parse_token_info (string, epos, epos + 1, spos, uri);
|
|
Packit Service |
3749ba |
if (ret == 0 && (uri_type & P11_KIT_URI_FOR_SLOT) == P11_KIT_URI_FOR_SLOT)
|
|
Packit Service |
3749ba |
ret = parse_slot_info (string, epos, epos + 1, spos, uri);
|
|
Packit Service |
3749ba |
if (ret == 0 && (uri_type & P11_KIT_URI_FOR_SLOT) == P11_KIT_URI_FOR_SLOT)
|
|
Packit Service |
3749ba |
ret = parse_slot_id (string, epos, epos + 1, spos, uri);
|
|
Packit Service |
3749ba |
if (ret == 0 && (uri_type & P11_KIT_URI_FOR_MODULE) == P11_KIT_URI_FOR_MODULE)
|
|
Packit Service |
3749ba |
ret = parse_module_info (string, epos, epos + 1, spos, uri);
|
|
Packit Service |
3749ba |
if (ret == 0 && (uri_type & P11_KIT_URI_FOR_MODULE_WITH_VERSION) == P11_KIT_URI_FOR_MODULE_WITH_VERSION)
|
|
Packit Service |
3749ba |
ret = parse_module_version_info (string, epos, epos + 1, spos, uri);
|
|
Packit Service |
3749ba |
/* Accept 'pin-source' and 'pin-value' in path
|
|
Packit Service |
3749ba |
* attributes for backward compatibility. */
|
|
Packit Service |
3749ba |
if (ret == 0)
|
|
Packit Service |
3749ba |
ret = parse_pin_query (string, epos, epos + 1, spos, uri);
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
if (ret < 0) {
|
|
Packit Service |
3749ba |
free (allocated);
|
|
Packit Service |
3749ba |
return ret;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
if (ret == 0)
|
|
Packit Service |
3749ba |
uri->unrecognized = true;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
string = spos;
|
|
Packit Service |
3749ba |
if (*spos == '\0')
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
if (*spos == '?')
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
string++;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/* Parse the query. */
|
|
Packit Service |
3749ba |
for (;;) {
|
|
Packit Service |
3749ba |
if (*string == '\0')
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
string++;
|
|
Packit Service |
3749ba |
spos = strchr (string, '&';;
|
|
Packit Service |
3749ba |
if (spos == NULL) {
|
|
Packit Service |
3749ba |
spos = string + strlen (string);
|
|
Packit Service |
3749ba |
assert (*spos == '\0');
|
|
Packit Service |
3749ba |
if (spos == string)
|
|
Packit Service |
3749ba |
break;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
epos = strchr (string, '=');
|
|
Packit Service |
3749ba |
if (epos == NULL || spos == string || epos == string || epos >= spos) {
|
|
Packit Service |
3749ba |
free (allocated);
|
|
Packit Service |
3749ba |
return P11_KIT_URI_BAD_SYNTAX;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
ret = parse_pin_query (string, epos, epos + 1, spos, uri);
|
|
Packit Service |
3749ba |
if (ret == 0)
|
|
Packit Service |
3749ba |
ret = parse_module_query (string, epos, epos + 1, spos, uri);
|
|
Packit Service |
3749ba |
if (ret == 0)
|
|
Packit Service |
3749ba |
ret = parse_vendor_query (string, epos, epos + 1, spos, uri);
|
|
Packit Service |
3749ba |
if (ret < 0) {
|
|
Packit Service |
3749ba |
free (allocated);
|
|
Packit Service |
3749ba |
return ret;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
string = spos;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
free (allocated);
|
|
Packit Service |
3749ba |
return P11_KIT_URI_OK;
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_free:
|
|
Packit Service |
3749ba |
* @uri: The URI
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Free a PKCS\#11 URI.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
void
|
|
Packit Service |
3749ba |
p11_kit_uri_free (P11KitUri *uri)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
if (!uri)
|
|
Packit Service |
3749ba |
return;
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
p11_attrs_free (uri->attrs);
|
|
Packit Service |
3749ba |
free (uri->pin_source);
|
|
Packit Service |
3749ba |
free (uri->pin_value);
|
|
Packit Service |
3749ba |
free (uri->module_name);
|
|
Packit Service |
3749ba |
free (uri->module_path);
|
|
Packit Service |
3749ba |
p11_array_free (uri->qattrs);
|
|
Packit Service |
3749ba |
free (uri);
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
|
|
Packit Service |
3749ba |
/**
|
|
Packit Service |
3749ba |
* p11_kit_uri_message:
|
|
Packit Service |
3749ba |
* @code: The error code
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Lookup a message for the uri error code. These codes are the P11_KIT_URI_XXX
|
|
Packit Service |
3749ba |
* error codes that can be returned from p11_kit_uri_parse() or
|
|
Packit Service |
3749ba |
* p11_kit_uri_format(). As a special case %NULL, will be returned for
|
|
Packit Service |
3749ba |
* %P11_KIT_URI_OK.
|
|
Packit Service |
3749ba |
*
|
|
Packit Service |
3749ba |
* Returns: The message for the error code. This string is owned by the p11-kit
|
|
Packit Service |
3749ba |
* library.
|
|
Packit Service |
3749ba |
*/
|
|
Packit Service |
3749ba |
const char*
|
|
Packit Service |
3749ba |
p11_kit_uri_message (int code)
|
|
Packit Service |
3749ba |
{
|
|
Packit Service |
3749ba |
switch (code) {
|
|
Packit Service |
3749ba |
case P11_KIT_URI_OK:
|
|
Packit Service |
3749ba |
return NULL;
|
|
Packit Service |
3749ba |
case P11_KIT_URI_UNEXPECTED:
|
|
Packit Service |
3749ba |
return "Unexpected or internal system error";
|
|
Packit Service |
3749ba |
case P11_KIT_URI_BAD_SCHEME:
|
|
Packit Service |
3749ba |
return "URI scheme must be 'pkcs11:'";
|
|
Packit Service |
3749ba |
case P11_KIT_URI_BAD_ENCODING:
|
|
Packit Service |
3749ba |
return "URI encoding invalid or corrupted";
|
|
Packit Service |
3749ba |
case P11_KIT_URI_BAD_SYNTAX:
|
|
Packit Service |
3749ba |
return "URI syntax is invalid";
|
|
Packit Service |
3749ba |
case P11_KIT_URI_BAD_VERSION:
|
|
Packit Service |
3749ba |
return "URI version component is invalid";
|
|
Packit Service |
3749ba |
case P11_KIT_URI_NOT_FOUND:
|
|
Packit Service |
3749ba |
return "The URI component was not found";
|
|
Packit Service |
3749ba |
default:
|
|
Packit Service |
3749ba |
p11_debug ("unknown error code: %d", code);
|
|
Packit Service |
3749ba |
return "Unknown error";
|
|
Packit Service |
3749ba |
}
|
|
Packit Service |
3749ba |
}
|