diff options
Diffstat (limited to 'lib/dns/sec/dnssafe/bkey.c')
-rw-r--r-- | lib/dns/sec/dnssafe/bkey.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/lib/dns/sec/dnssafe/bkey.c b/lib/dns/sec/dnssafe/bkey.c new file mode 100644 index 00000000..ddd23460 --- /dev/null +++ b/lib/dns/sec/dnssafe/bkey.c @@ -0,0 +1,101 @@ +/* Copyright (C) RSA Data Security, Inc. created 1993, 1996. This is an + unpublished work protected as such under copyright law. This work + contains proprietary, confidential, and trade secret information of + RSA Data Security, Inc. Use, disclosure or reproduction without the + express written authorization of RSA Data Security, Inc. is + prohibited. + */ + +#include "global.h" +#include "bsafe2.h" +#include "bkey.h" +#include "kinfotyp.h" +#include "kiitem.h" + +int B_KeySetInfo (key, keyInfoType, info) +B_Key *key; +B_KeyInfoType *keyInfoType; +POINTER info; +{ + if (key == (B_Key *)NULL_PTR) + return (BE_KEY_OBJ); + + if (key->infoCache.z.infoCount > 0) + return (BE_KEY_ALREADY_SET); + + /* This will cache the encoding. */ + return ((*keyInfoType->AddInfo) (key, info)); +} + +int B_KeyGetInfo (key, info, keyInfoType) +B_Key *key; +POINTER *info; +B_KeyInfoType *keyInfoType; +{ + int status; + + if (key == (B_Key *)NULL_PTR) + return (BE_KEY_OBJ); + + if (key->infoCache.z.infoCount == 0) + return (BE_KEY_NOT_SET); + + /* First check if the encoding is already in the encoding cache. + */ + if (B_InfoCacheFindInfo (&key->infoCache, info, (POINTER)keyInfoType) == 0) + return (0); + + /* Info is not in the cache, go ahead and encode. + */ + if ((status = (*keyInfoType->MakeInfo) (info, key)) != 0) + return (status); + + return (B_InfoCacheAddInfo (&key->infoCache, (POINTER)keyInfoType, *info)); +} + +/* Create an ITEM out of the data and len and cache it as KITItem. + The data is already alloced in the info cache. + Returns 0, BE_ALLOC. + */ +int B_KeyAddItemInfo (key, data, len) +B_Key *key; +unsigned char *data; +unsigned int len; +{ + ITEM *newInfo; + int status; + + if ((status = B_MemoryPoolAlloc + (&key->infoCache.memoryPool, (POINTER *)&newInfo, sizeof (*newInfo))) + != 0) + return (status); + + newInfo->data = data; + newInfo->len = len; + + return (B_InfoCacheAddInfo + (&key->infoCache, (POINTER)&KITItem, (POINTER)newInfo)); +} + +/* Return the number of bits in the canonical, positive integer. + B_IntegerBits (0) = 0. + */ +unsigned int B_IntegerBits (integer, integerLen) +unsigned char *integer; +unsigned int integerLen; +{ + unsigned char mask, byte; + unsigned int bytes, bits; + + for (bytes = 0; bytes < integerLen && integer[bytes] == 0; bytes++); + if (bytes == integerLen) + return (0); + + /* Get byte to test and increment byte count for final calculation */ + byte = integer[bytes++]; + + /* Get number of bits in most significant byte */ + for (bits = 8, mask = 0x80; (byte & mask) == 0; bits--, mask >>= 1); + return (8 * (integerLen - bytes) + bits); +} + |