| /* LibTomCrypt, modular cryptographic library -- Tom St Denis |
| * |
| * LibTomCrypt is a library that provides various cryptographic |
| * algorithms in a highly modular and flexible manner. |
| * |
| * The library is free for all purposes without any express |
| * guarantee it works. |
| * |
| * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.org |
| */ |
| #include "tomcrypt.h" |
| |
| /** |
| @file der_length_object_identifier.c |
| ASN.1 DER, get length of Object Identifier, Tom St Denis |
| */ |
| |
| #ifdef LTC_DER |
| |
| unsigned long der_object_identifier_bits(unsigned long x) |
| { |
| unsigned long c; |
| x &= 0xFFFFFFFF; |
| c = 0; |
| while (x) { |
| ++c; |
| x >>= 1; |
| } |
| return c; |
| } |
| |
| |
| /** |
| Gets length of DER encoding of Object Identifier |
| @param nwords The number of OID words |
| @param words The actual OID words to get the size of |
| @param outlen [out] The length of the DER encoding for the given string |
| @return CRYPT_OK if successful |
| */ |
| int der_length_object_identifier(unsigned long *words, unsigned long nwords, unsigned long *outlen) |
| { |
| unsigned long y, z, t; |
| |
| LTC_ARGCHK(words != NULL); |
| LTC_ARGCHK(outlen != NULL); |
| |
| |
| /* must be >= 2 words */ |
| if (nwords < 2) { |
| return CRYPT_INVALID_ARG; |
| } |
| |
| /* word1 = 0,1,2 and word2 0..39 */ |
| if (words[0] > 2 || words[1] > 39) { |
| return CRYPT_INVALID_ARG; |
| } |
| |
| /* leading byte of first two words */ |
| z = 1; |
| for (y = 2; y < nwords; y++) { |
| t = der_object_identifier_bits(words[y]); |
| z += t/7 + ((t%7) ? 1 : 0); |
| } |
| |
| /* now depending on the length our length encoding changes */ |
| if (z < 128) { |
| z += 2; |
| } else if (z < 256) { |
| z += 3; |
| } else if (z < 65536UL) { |
| z += 4; |
| } else { |
| return CRYPT_INVALID_ARG; |
| } |
| |
| *outlen = z; |
| return CRYPT_OK; |
| } |
| |
| #endif |
| |
| /* $Source: /cvs/libtom/libtomcrypt/src/pk/asn1/der/object_identifier/der_length_object_identifier.c,v $ */ |
| /* $Revision: 1.1 $ */ |
| /* $Date: 2005/05/16 15:08:11 $ */ |