| OLD | NEW | 
|    1 /* This Source Code Form is subject to the terms of the Mozilla Public |    1 /* This Source Code Form is subject to the terms of the Mozilla Public | 
|    2  * License, v. 2.0. If a copy of the MPL was not distributed with this |    2  * License, v. 2.0. If a copy of the MPL was not distributed with this | 
|    3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |    3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 
|    4 #include "cryptohi.h" |    4 #include "cryptohi.h" | 
|    5 #include "secasn1.h" |    5 #include "secasn1.h" | 
|    6 #include "secitem.h" |    6 #include "secitem.h" | 
|    7 #include "prerr.h" |    7 #include "prerr.h" | 
|    8  |    8  | 
|    9 #ifndef DSA_SUBPRIME_LEN |    9 #ifndef DSA1_SUBPRIME_LEN | 
|   10 #define DSA_SUBPRIME_LEN 20»    /* bytes */ |   10 #define DSA1_SUBPRIME_LEN 20»   /* bytes */ | 
|   11 #endif |   11 #endif | 
|   12  |   12  | 
|   13 typedef struct { |   13 typedef struct { | 
|   14     SECItem r; |   14     SECItem r; | 
|   15     SECItem s; |   15     SECItem s; | 
|   16 } DSA_ASN1Signature; |   16 } DSA_ASN1Signature; | 
|   17  |   17  | 
|   18 const SEC_ASN1Template DSA_SignatureTemplate[] = |   18 const SEC_ASN1Template DSA_SignatureTemplate[] = | 
|   19 { |   19 { | 
|   20     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(DSA_ASN1Signature) }, |   20     { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(DSA_ASN1Signature) }, | 
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  148     if (item == NULL) |  148     if (item == NULL) | 
|  149         return SECFailure; |  149         return SECFailure; | 
|  150  |  150  | 
|  151     /* XXX leak item? */ |  151     /* XXX leak item? */ | 
|  152     return SECSuccess; |  152     return SECSuccess; | 
|  153 } |  153 } | 
|  154  |  154  | 
|  155 /* src is a DER-encoded ECDSA or DSA signature. |  155 /* src is a DER-encoded ECDSA or DSA signature. | 
|  156 ** Returns a newly-allocated SECItem structure, pointing at a newly allocated |  156 ** Returns a newly-allocated SECItem structure, pointing at a newly allocated | 
|  157 ** buffer containing the "raw" signature, which is len bytes of r, |  157 ** buffer containing the "raw" signature, which is len bytes of r, | 
|  158 ** followed by len bytes of s. For DSA, len is always DSA_SUBPRIME_LEN. |  158 ** followed by len bytes of s. For DSA, len is the length of q. | 
|  159 ** For ECDSA, len depends on the key size used to create the signature. |  159 ** For ECDSA, len depends on the key size used to create the signature. | 
|  160 */ |  160 */ | 
|  161 static SECItem * |  161 static SECItem * | 
|  162 common_DecodeDerSig(const SECItem *item, unsigned int len) |  162 common_DecodeDerSig(const SECItem *item, unsigned int len) | 
|  163 { |  163 { | 
|  164     SECItem *         result = NULL; |  164     SECItem *         result = NULL; | 
|  165     SECStatus         status; |  165     SECStatus         status; | 
|  166     DSA_ASN1Signature sig; |  166     DSA_ASN1Signature sig; | 
|  167     SECItem           dst; |  167     SECItem           dst; | 
|  168  |  168  | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  206     return result; |  206     return result; | 
|  207  |  207  | 
|  208 loser: |  208 loser: | 
|  209     if (result != NULL) { |  209     if (result != NULL) { | 
|  210         SECITEM_FreeItem(result, PR_TRUE); |  210         SECITEM_FreeItem(result, PR_TRUE); | 
|  211         result = NULL; |  211         result = NULL; | 
|  212     } |  212     } | 
|  213     goto done; |  213     goto done; | 
|  214 } |  214 } | 
|  215  |  215  | 
|  216 /* src is a "raw" DSA signature, 20 bytes of r followed by 20 bytes of s. |  216 /* src is a "raw" DSA1 signature, 20 bytes of r followed by 20 bytes of s. | 
|  217 ** dest is the signature DER encoded. ? |  217 ** dest is the signature DER encoded. ? | 
|  218 */ |  218 */ | 
|  219 SECStatus |  219 SECStatus | 
|  220 DSAU_EncodeDerSig(SECItem *dest, SECItem *src) |  220 DSAU_EncodeDerSig(SECItem *dest, SECItem *src) | 
|  221 { |  221 { | 
|  222     PORT_Assert(src->len == 2 * DSA_SUBPRIME_LEN); |  222     PORT_Assert(src->len == 2 * DSA1_SUBPRIME_LEN); | 
|  223     if (src->len != 2 * DSA_SUBPRIME_LEN) { |  223     if (src->len != 2 * DSA1_SUBPRIME_LEN) { | 
|  224         PORT_SetError( PR_INVALID_ARGUMENT_ERROR ); |  224         PORT_SetError( PR_INVALID_ARGUMENT_ERROR ); | 
|  225         return SECFailure; |  225         return SECFailure; | 
|  226     } |  226     } | 
|  227  |  227  | 
|  228     return common_EncodeDerSig(dest, src); |  228     return common_EncodeDerSig(dest, src); | 
|  229 } |  229 } | 
|  230  |  230  | 
|  231 /* src is a "raw" DSA signature of length len (len/2 bytes of r followed |  231 /* src is a "raw" DSA signature of length len (len/2 bytes of r followed | 
|  232 ** by len/2 bytes of s). dest is the signature DER encoded. |  232 ** by len/2 bytes of s). dest is the signature DER encoded. | 
|  233 */ |  233 */ | 
|  234 SECStatus |  234 SECStatus | 
|  235 DSAU_EncodeDerSigWithLen(SECItem *dest, SECItem *src, unsigned int len) |  235 DSAU_EncodeDerSigWithLen(SECItem *dest, SECItem *src, unsigned int len) | 
|  236 { |  236 { | 
|  237  |  237  | 
|  238     PORT_Assert((src->len == len) && (len % 2 == 0)); |  238     PORT_Assert((src->len == len) && (len % 2 == 0)); | 
|  239     if ((src->len != len) || (src->len % 2 != 0)) { |  239     if ((src->len != len) || (src->len % 2 != 0)) { | 
|  240         PORT_SetError( PR_INVALID_ARGUMENT_ERROR ); |  240         PORT_SetError( PR_INVALID_ARGUMENT_ERROR ); | 
|  241         return SECFailure; |  241         return SECFailure; | 
|  242     } |  242     } | 
|  243  |  243  | 
|  244     return common_EncodeDerSig(dest, src); |  244     return common_EncodeDerSig(dest, src); | 
|  245 } |  245 } | 
|  246  |  246  | 
|  247 /* src is a DER-encoded DSA signature. |  247 /* src is a DER-encoded DSA signature. | 
|  248 ** Returns a newly-allocated SECItem structure, pointing at a newly allocated |  248 ** Returns a newly-allocated SECItem structure, pointing at a newly allocated | 
|  249 ** buffer containing the "raw" DSA signature, which is 20 bytes of r, |  249 ** buffer containing the "raw" DSA1 signature, which is 20 bytes of r, | 
|  250 ** followed by 20 bytes of s. |  250 ** followed by 20 bytes of s. | 
|  251 */ |  251 */ | 
|  252 SECItem * |  252 SECItem * | 
|  253 DSAU_DecodeDerSig(const SECItem *item) |  253 DSAU_DecodeDerSig(const SECItem *item) | 
|  254 { |  254 { | 
|  255     return common_DecodeDerSig(item, DSA_SUBPRIME_LEN); |  255     return common_DecodeDerSig(item, DSA1_SUBPRIME_LEN); | 
|  256 } |  256 } | 
|  257  |  257  | 
|  258 /* src is a DER-encoded ECDSA signature. |  258 /* src is a DER-encoded ECDSA signature. | 
|  259 ** Returns a newly-allocated SECItem structure, pointing at a newly allocated |  259 ** Returns a newly-allocated SECItem structure, pointing at a newly allocated | 
|  260 ** buffer containing the "raw" ECDSA signature of length len containing |  260 ** buffer containing the "raw" ECDSA signature of length len containing | 
|  261 ** r followed by s (both padded to take up exactly len/2 bytes). |  261 ** r followed by s (both padded to take up exactly len/2 bytes). | 
|  262 */ |  262 */ | 
|  263 SECItem * |  263 SECItem * | 
|  264 DSAU_DecodeDerSigToLen(const SECItem *item, unsigned int len) |  264 DSAU_DecodeDerSigToLen(const SECItem *item, unsigned int len) | 
|  265 { |  265 { | 
|  266     return common_DecodeDerSig(item, len/2); |  266     return common_DecodeDerSig(item, len/2); | 
|  267 } |  267 } | 
| OLD | NEW |