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 #ifndef _CMAC_H_ 6 #define _CMAC_H_ 7 8 typedef struct CMACContextStr CMACContext; 9 10 SEC_BEGIN_PROTOS 11 12 /* Enum for identifying the underlying block cipher we're using internally. */ 13 typedef enum { 14 CMAC_AES = 0 15 } CMACCipher; 16 17 /* Initialize an existing CMACContext struct. */ 18 SECStatus CMAC_Init(CMACContext *ctx, CMACCipher type, 19 const unsigned char *key, unsigned int key_len); 20 21 /* Allocate and initialize a new CMAC context with the specified cipher and 22 * key. */ 23 CMACContext *CMAC_Create(CMACCipher type, const unsigned char *key, 24 unsigned int key_len); 25 26 /* Called automatically by CMAC_*{Create,Init}(...). Only useful for restarting 27 * an already-started CMAC instance. */ 28 SECStatus CMAC_Begin(CMACContext *ctx); 29 30 /* Add the specified bytes into the CMAC state. */ 31 SECStatus CMAC_Update(CMACContext *ctx, const unsigned char *data, 32 unsigned int data_len); 33 34 /* Finalize the CMAC state and return the result. */ 35 SECStatus CMAC_Finish(CMACContext *ctx, unsigned char *result, 36 unsigned int *result_len, 37 unsigned int max_result_len); 38 39 /* Note: CMAC_Clone isn't implemented here because AES doesn't expose a 40 * context-cloning operation. */ 41 42 /* Destroy a CMAC context, optionally freeing it. */ 43 void CMAC_Destroy(CMACContext *ctx, PRBool free_it); 44 45 SEC_END_PROTOS 46 47 #endif cmac_ShiftLeftOne(unsigned char * out,const unsigned char * in,int length)48