| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| #include "secplcy.h" |
| #include "prmem.h" |
| |
| SECCipherFind * |
| sec_CipherFindInit(PRBool onlyAllowed, |
| secCPStruct *policy, |
| long *ciphers) |
| { |
| SECCipherFind *find = PR_NEWZAP(SECCipherFind); |
| if (find) { |
| find->policy = policy; |
| find->ciphers = ciphers; |
| find->onlyAllowed = onlyAllowed; |
| find->index = -1; |
| } |
| return find; |
| } |
| |
| long |
| sec_CipherFindNext(SECCipherFind *find) |
| { |
| char *policy; |
| long rv = -1; |
| secCPStruct *policies = (secCPStruct *)find->policy; |
| long *ciphers = (long *)find->ciphers; |
| long numCiphers = policies->num_ciphers; |
| |
| find->index++; |
| while ((find->index < numCiphers) && (rv == -1)) { |
| /* Translate index to cipher. */ |
| rv = ciphers[find->index]; |
| |
| /* If we're only looking for allowed ciphers, and if this |
| cipher isn't allowed, loop around.*/ |
| if (find->onlyAllowed) { |
| /* Find the appropriate policy flag. */ |
| policy = (&(policies->begin_ciphers)) + find->index + 1; |
| |
| /* If this cipher isn't allowed by policy, continue. */ |
| if (!(*policy)) { |
| rv = -1; |
| find->index++; |
| } |
| } |
| } |
| |
| return rv; |
| } |
| |
| char |
| sec_IsCipherAllowed(long cipher, secCPStruct *policies, |
| long *ciphers) |
| { |
| char result = SEC_CIPHER_NOT_ALLOWED; /* our default answer */ |
| long numCiphers = policies->num_ciphers; |
| char *policy; |
| int i; |
| |
| /* Convert the cipher number into a policy flag location. */ |
| for (i = 0, policy = (&(policies->begin_ciphers) + 1); |
| i < numCiphers; |
| i++, policy++) { |
| if (cipher == ciphers[i]) |
| break; |
| } |
| |
| if (i < numCiphers) { |
| /* Found the cipher, get the policy value. */ |
| result = *policy; |
| } |
| |
| return result; |
| } |
| |
| void |
| sec_CipherFindEnd(SECCipherFind *find) |
| { |
| PR_FREEIF(find); |
| } |