/* Copyright (c) 2005-2007 Apple Inc. All Rights Reserved. */ /* * rsaRawKey.h - Typedefs and declarations for RSA keys in raw format * * Created Nov. 29 2005 by Doug Mitchell. */ #include #include #include #include #ifndef RSA_RAW_KEY_ENABLE #error Please define RSA_RAW_KEY_ENABLE. #endif #if RSA_RAW_KEY_ENABLE #if RSA_PUB_KEY_ENABLE || RSA_PRIV_KEY_ENABLE /* init an lgiant, fill it with incoming bytes */ static RSAStatus rsaSetGiant( lgiant *g, unsigned char *c, gi_uint16 cLen) { localGiantAlloc(g); if(deserializeGiant(&g->g, c, cLen)) { return RSA_BadKeyData; } return RSA_Success; } #endif /* RSA_PUB_KEY_ENABLE || RSA_PRIV_KEY_ENABLE */ #if RSA_PUB_KEY_ENABLE /* raw (n, e) in API form --> public RSAGiantKey */ RSAStatus rsaInitPubGKey( const RSAPubKey *apiKey, RSAPubGiantKey *pubKey) { if((apiKey == NULL) || (pubKey == NULL)) { return RSA_ParamErr; } if((apiKey->e == NULL) || (apiKey->n == NULL)) { return RSA_IncompleteKey; } if(rsaSetGiant(&pubKey->n, apiKey->n, apiKey->nLen)) { return RSA_BadKeyData; } if(rsaSetGiant(&pubKey->e, apiKey->e, apiKey->eLen)) { return RSA_BadKeyData; } localGiantAlloc(&pubKey->recip); if(apiKey->recip) { /* caller provided reciprocal */ if(deserializeGiant(&pubKey->recip.g, apiKey->recip, apiKey->recipLen)) { return RSA_BadKeyData; } } /* else make_recip called lazily when the key is actually used */ return RSA_Success; } #endif /* RSA_PUB_KEY_ENABLE */ #if RSA_PRIV_KEY_ENABLE /* init an rsaSgiant, fill it with incoming bytes */ static RSAStatus rsaSetSGiant( rsaSgiant *g, unsigned char *c, gi_uint16 cLen) { localSmallGiantAlloc(g); if(deserializeGiant(&g->g, c, cLen)) { return RSA_BadKeyData; } return RSA_Success; } /* raw (p, q, dp, dq, qInv) --> private RSAPrivCRTGiantKey */ RSAStatus rsaInitPrivGKey( const RSAPrivKey *apiKey, RSAPrivGiantKey *privKey) { if((apiKey == NULL) || (privKey == NULL)) { return RSA_ParamErr; } if((apiKey->p == NULL) || (apiKey->q == NULL) || (apiKey->dp == NULL) || (apiKey->dq == NULL) || (apiKey->qInv == NULL)) { return RSA_ParamErr; } if(rsaSetSGiant(&privKey->p, apiKey->p, apiKey->pLen)) { return RSA_BadKeyData; } if(rsaSetSGiant(&privKey->q, apiKey->q, apiKey->qLen)) { return RSA_BadKeyData; } if(rsaSetSGiant(&privKey->dp, apiKey->dp, apiKey->dpLen)) { return RSA_BadKeyData; } if(rsaSetSGiant(&privKey->dq, apiKey->dq, apiKey->dqLen)) { return RSA_BadKeyData; } if(rsaSetSGiant(&privKey->qInv, apiKey->qInv, apiKey->qInvLen)) { return RSA_BadKeyData; } /* pRecip, qRecip evaluated lazily */ localSmallGiantAlloc(&privKey->pRecip); localSmallGiantAlloc(&privKey->qRecip); return RSA_Success; } #endif /* RSA_PRIV_KEY_ENABLE */ #endif /* RSA_RAW_KEY_ENABLE */