Index: security/nss/lib/softoken/lowkey.c =================================================================== RCS file: /cvsroot/mozilla/security/nss/lib/softoken/lowkey.c,v retrieving revision 1.10 diff -u -p -8 -r1.10 lowkey.c --- security/nss/lib/softoken/lowkey.c 8 Feb 2008 02:50:47 -0000 1.10 +++ security/nss/lib/softoken/lowkey.c 8 Aug 2010 19:30:35 -0000 @@ -258,16 +258,17 @@ nsslowkey_DestroyPrivateKey(NSSLOWKEYPri void nsslowkey_DestroyPublicKey(NSSLOWKEYPublicKey *pubk) { if (pubk && pubk->arena) { PORT_FreeArena(pubk->arena, PR_FALSE); } } + unsigned nsslowkey_PublicModulusLen(NSSLOWKEYPublicKey *pubk) { unsigned char b0; /* interpret modulus length as key strength... in * fortezza that's the public key length */ @@ -277,31 +278,81 @@ nsslowkey_PublicModulusLen(NSSLOWKEYPubl return b0 ? pubk->u.rsa.modulus.len : pubk->u.rsa.modulus.len - 1; default: break; } return 0; } unsigned +nsslowkey_PublicModulusBits(NSSLOWKEYPublicKey *pubk) +{ + unsigned char b0; + unsigned int bits; + + switch (pubk->keyType) { + case NSSLOWKEYRSAKey: + bits = (pubk->u.rsa.modulus.len - 1) * 8; + b0 = pubk->u.rsa.modulus.data[0]; + if (b0 == 0) { /* first byte is zero */ + bits -= 8; + b0 = pubk->u.rsa.modulus.data[1]; + } + while(b0 != 0) { + bits++; + b0 >>= 1; + } + return bits; + default: + break; + } + return 0; +} + +unsigned nsslowkey_PrivateModulusLen(NSSLOWKEYPrivateKey *privk) { unsigned char b0; switch (privk->keyType) { case NSSLOWKEYRSAKey: b0 = privk->u.rsa.modulus.data[0]; return b0 ? privk->u.rsa.modulus.len : privk->u.rsa.modulus.len - 1; default: break; } return 0; } +unsigned +nsslowkey_PrivateModulusBits(NSSLOWKEYPrivateKey *privk) +{ + unsigned char b0; + unsigned int bits; + + switch (privk->keyType) { + case NSSLOWKEYRSAKey: + bits = (privk->u.rsa.modulus.len - 1) * 8; + b0 = privk->u.rsa.modulus.data[0]; + if (b0 == 0) { /* first byte is zero */ + bits -= 8; + b0 = privk->u.rsa.modulus.data[1]; + } + while(b0 != 0) { + bits++; + b0 >>= 1; + } + return bits; + default: + break; + } + return 0; +} + NSSLOWKEYPublicKey * nsslowkey_ConvertToPublicKey(NSSLOWKEYPrivateKey *privk) { NSSLOWKEYPublicKey *pubk; PLArenaPool *arena; arena = PORT_NewArena (DER_DEFAULT_CHUNKSIZE); Index: security/nss/lib/softoken/lowkeyi.h =================================================================== RCS file: /cvsroot/mozilla/security/nss/lib/softoken/lowkeyi.h,v retrieving revision 1.11 diff -u -p -8 -r1.11 lowkeyi.h --- security/nss/lib/softoken/lowkeyi.h 13 Jun 2007 00:24:56 -0000 1.11 +++ security/nss/lib/softoken/lowkeyi.h 8 Aug 2010 19:30:35 -0000 @@ -78,22 +78,30 @@ extern void nsslowkey_DestroyPrivateKey( */ extern void nsslowkey_DestroyPublicKey(NSSLOWKEYPublicKey *key); /* ** Return the modulus length of "pubKey". */ extern unsigned int nsslowkey_PublicModulusLen(NSSLOWKEYPublicKey *pubKey); +/* +** Return the modulus length of "pubKey" in bits. +*/ +extern unsigned int nsslowkey_PublicModulusBits(NSSLOWKEYPublicKey *pubKey); /* ** Return the modulus length of "privKey". */ extern unsigned int nsslowkey_PrivateModulusLen(NSSLOWKEYPrivateKey *privKey); +/* +** Return the modulus length of "privKey" in bits. +*/ +extern unsigned int nsslowkey_PrivateModulusBits(NSSLOWKEYPrivateKey *privKey); /* ** Convert a low private key "privateKey" into a public low key */ extern NSSLOWKEYPublicKey *nsslowkey_ConvertToPublicKey(NSSLOWKEYPrivateKey *privateKey); /* Make a copy of a low private key in it's own arena.