| OLD | NEW |
| (Empty) |
| 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 | |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
| 4 | |
| 5 #include "secoid.h" | |
| 6 #include "secder.h" /* XXX remove this when remove the DERTemplate */ | |
| 7 #include "secasn1.h" | |
| 8 #include "secitem.h" | |
| 9 #include "secerr.h" | |
| 10 | |
| 11 SECOidTag | |
| 12 SECOID_GetAlgorithmTag(SECAlgorithmID *id) | |
| 13 { | |
| 14 if (id == NULL || id->algorithm.data == NULL) | |
| 15 return SEC_OID_UNKNOWN; | |
| 16 | |
| 17 return SECOID_FindOIDTag (&(id->algorithm)); | |
| 18 } | |
| 19 | |
| 20 SECStatus | |
| 21 SECOID_SetAlgorithmID(PRArenaPool *arena, SECAlgorithmID *id, SECOidTag which, | |
| 22 SECItem *params) | |
| 23 { | |
| 24 SECOidData *oiddata; | |
| 25 PRBool add_null_param; | |
| 26 | |
| 27 oiddata = SECOID_FindOIDByTag(which); | |
| 28 if ( !oiddata ) { | |
| 29 PORT_SetError(SEC_ERROR_INVALID_ALGORITHM); | |
| 30 return SECFailure; | |
| 31 } | |
| 32 | |
| 33 if (SECITEM_CopyItem(arena, &id->algorithm, &oiddata->oid)) | |
| 34 return SECFailure; | |
| 35 | |
| 36 switch (which) { | |
| 37 case SEC_OID_MD2: | |
| 38 case SEC_OID_MD4: | |
| 39 case SEC_OID_MD5: | |
| 40 case SEC_OID_SHA1: | |
| 41 case SEC_OID_SHA224: | |
| 42 case SEC_OID_SHA256: | |
| 43 case SEC_OID_SHA384: | |
| 44 case SEC_OID_SHA512: | |
| 45 case SEC_OID_PKCS1_RSA_ENCRYPTION: | |
| 46 case SEC_OID_PKCS1_MD2_WITH_RSA_ENCRYPTION: | |
| 47 case SEC_OID_PKCS1_MD4_WITH_RSA_ENCRYPTION: | |
| 48 case SEC_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION: | |
| 49 case SEC_OID_PKCS1_SHA1_WITH_RSA_ENCRYPTION: | |
| 50 case SEC_OID_PKCS1_SHA224_WITH_RSA_ENCRYPTION: | |
| 51 case SEC_OID_PKCS1_SHA256_WITH_RSA_ENCRYPTION: | |
| 52 case SEC_OID_PKCS1_SHA384_WITH_RSA_ENCRYPTION: | |
| 53 case SEC_OID_PKCS1_SHA512_WITH_RSA_ENCRYPTION: | |
| 54 add_null_param = PR_TRUE; | |
| 55 break; | |
| 56 default: | |
| 57 add_null_param = PR_FALSE; | |
| 58 break; | |
| 59 } | |
| 60 | |
| 61 if (params) { | |
| 62 /* | |
| 63 * I am specifically *not* enforcing the following assertion | |
| 64 * (by following it up with an error and a return of failure) | |
| 65 * because I do not want to introduce any change in the current | |
| 66 * behavior. But I do want for us to notice if the following is | |
| 67 * ever true, because I do not think it should be so and probably | |
| 68 * signifies an error/bug somewhere. | |
| 69 */ | |
| 70 PORT_Assert(!add_null_param || (params->len == 2 | |
| 71 && params->data[0] == SEC_ASN1_NULL | |
| 72 && params->data[1] == 0)); | |
| 73 if (SECITEM_CopyItem(arena, &id->parameters, params)) { | |
| 74 return SECFailure; | |
| 75 } | |
| 76 } else { | |
| 77 /* | |
| 78 * Again, this is not considered an error. But if we assume | |
| 79 * that nobody tries to set the parameters field themselves | |
| 80 * (but always uses this routine to do that), then we should | |
| 81 * not hit the following assertion. Unless they forgot to zero | |
| 82 * the structure, which could also be a bad (and wrong) thing. | |
| 83 */ | |
| 84 PORT_Assert(id->parameters.data == NULL); | |
| 85 | |
| 86 if (add_null_param) { | |
| 87 (void) SECITEM_AllocItem(arena, &id->parameters, 2); | |
| 88 if (id->parameters.data == NULL) { | |
| 89 return SECFailure; | |
| 90 } | |
| 91 id->parameters.data[0] = SEC_ASN1_NULL; | |
| 92 id->parameters.data[1] = 0; | |
| 93 } | |
| 94 } | |
| 95 | |
| 96 return SECSuccess; | |
| 97 } | |
| 98 | |
| 99 SECStatus | |
| 100 SECOID_CopyAlgorithmID(PRArenaPool *arena, SECAlgorithmID *to, SECAlgorithmID *f
rom) | |
| 101 { | |
| 102 SECStatus rv; | |
| 103 | |
| 104 rv = SECITEM_CopyItem(arena, &to->algorithm, &from->algorithm); | |
| 105 if (rv) return rv; | |
| 106 rv = SECITEM_CopyItem(arena, &to->parameters, &from->parameters); | |
| 107 return rv; | |
| 108 } | |
| 109 | |
| 110 void SECOID_DestroyAlgorithmID(SECAlgorithmID *algid, PRBool freeit) | |
| 111 { | |
| 112 SECITEM_FreeItem(&algid->parameters, PR_FALSE); | |
| 113 SECITEM_FreeItem(&algid->algorithm, PR_FALSE); | |
| 114 if(freeit == PR_TRUE) | |
| 115 PORT_Free(algid); | |
| 116 } | |
| 117 | |
| 118 SECComparison | |
| 119 SECOID_CompareAlgorithmID(SECAlgorithmID *a, SECAlgorithmID *b) | |
| 120 { | |
| 121 SECComparison rv; | |
| 122 | |
| 123 rv = SECITEM_CompareItem(&a->algorithm, &b->algorithm); | |
| 124 if (rv) return rv; | |
| 125 rv = SECITEM_CompareItem(&a->parameters, &b->parameters); | |
| 126 return rv; | |
| 127 } | |
| OLD | NEW |