Home | History | Annotate | Download | only in converter

Lines Matching defs:pSession

239  * @param[in,out] pSession A reference to a converter session.
243 static int FwdLockConv_DeriveKeys(FwdLockConv_Session_t *pSession) {
255 if (AES_set_encrypt_key(pSession->sessionKey, KEY_SIZE_IN_BITS,
263 &pSession->encryptionRoundKeys) != 0) {
269 HMAC_CTX_init(&pSession->signingContext);
270 HMAC_Init_ex(&pSession->signingContext, pData->key, KEY_SIZE, EVP_sha1(), NULL);
310 * @param[in,out] pSession A reference to a converter session.
314 static FwdLockConv_Status_t FwdLockConv_RightTrimDelimiter(FwdLockConv_Session_t *pSession) {
315 while (pSession->delimiterLength > 4 &&
316 pSession->delimiter[pSession->delimiterLength - 1] == ' ') {
317 --pSession->delimiterLength;
319 if (pSession->delimiterLength > 4) {
328 * @param[in,out] pSession A reference to a converter session.
333 static FwdLockConv_Status_t FwdLockConv_MatchOpenDelimiter(FwdLockConv_Session_t *pSession,
336 switch (pSession->scannerState) {
339 pSession->scannerState = FwdLockConv_ScannerState_WantsSecondDash;
341 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
343 pSession->scannerState = FwdLockConv_ScannerState_WantsCR;
350 pSession->delimiter[0] = '\r';
351 pSession->delimiter[1] = '\n';
352 pSession->delimiter[2] = '-';
353 pSession->delimiter[3] = '-';
354 pSession->delimiterLength = 4;
355 pSession->scannerState = FwdLockConv_ScannerState_WantsBoundary;
357 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
359 pSession->scannerState = FwdLockConv_ScannerState_WantsCR;
364 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
369 pSession->scannerState = FwdLockConv_ScannerState_WantsFirstDash;
371 pSession->scannerState = FwdLockConv_ScannerState_WantsCR;
378 if (pSession->delimiterLength < MAX_DELIMITER_LENGTH) {
379 pSession->delimiter[pSession->delimiterLength++] = ch;
384 status = FwdLockConv_RightTrimDelimiter(pSession);
386 pSession->scannerState = FwdLockConv_ScannerState_WantsBoundaryEnd;
389 status = FwdLockConv_RightTrimDelimiter(pSession);
391 pSession->scannerState = FwdLockConv_ScannerState_WantsWhitespace;
399 pSession->scannerState = FwdLockConv_ScannerState_WantsBoundaryEnd;
406 pSession->parserState = FwdLockConv_ParserState_WantsMimeHeaders;
407 pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderNameStart;
467 * @param[in,out] pSession A reference to a converter session.
471 static FwdLockConv_Status_t FwdLockConv_RecognizeMimeHeaderName(FwdLockConv_Session_t *pSession) {
473 if (strncmp(pSession->mimeHeaderName.ptr, strContent, strlenContent) == 0) {
474 if (strcmp(pSession->mimeHeaderName.ptr + strlenContent, strType) == 0) {
475 if (pSession->contentType.ptr == NULL) {
476 pSession->scannerState = FwdLockConv_ScannerState_WantsContentTypeStart;
480 } else if (strcmp(pSession->mimeHeaderName.ptr + strlenContent, strTransferEncoding) == 0) {
481 if (pSession->contentTransferEncoding ==
483 pSession->scannerState = FwdLockConv_ScannerState_WantsContentTransferEncodingStart;
488 pSession->scannerState = FwdLockConv_ScannerState_WantsCR;
491 pSession->scannerState = FwdLockConv_ScannerState_WantsCR;
499 * @param[in,out] pSession A reference to a converter session.
503 static FwdLockConv_Status_t FwdLockConv_ApplyDefaults(FwdLockConv_Session_t *pSession) {
504 if (pSession->contentType.ptr == NULL) {
506 pSession->contentType.ptr = malloc(sizeof strTextPlain);
507 if (pSession->contentType.ptr == NULL) {
510 memcpy(pSession->contentType.ptr, strTextPlain, sizeof strTextPlain);
511 pSession->contentType.length = strlenTextPlain;
512 pSession->contentType.maxLength = strlenTextPlain;
514 if (pSession->contentTransferEncoding == FwdLockConv_ContentTransferEncoding_Undefined) {
516 pSession->contentTransferEncoding = FwdLockConv_ContentTransferEncoding_Binary;
524 * @param[in,out] pSession A reference to a converter session.
528 static FwdLockConv_Status_t FwdLockConv_VerifyContentType(FwdLockConv_Session_t *pSession) {
530 if (pSession->contentType.ptr == NULL) {
532 } else if (strcmp(pSession->contentType.ptr, strApplicationVndOmaDrmRightsXml) == 0 ||
533 strcmp(pSession->contentType.ptr, strApplicationVndOmaDrmContent) == 0) {
544 * @param[in,out] pSession A reference to a converter session.
549 static FwdLockConv_Status_t FwdLockConv_WriteHeader(FwdLockConv_Session_t *pSession,
552 if (pSession->contentType.length > UCHAR_MAX) {
555 pSession->outputBufferSize = OUTPUT_BUFFER_SIZE_INCREMENT;
556 pOutput->fromConvertData.pBuffer = malloc(pSession->outputBufferSize);
560 size_t encryptedSessionKeyPos = TOP_HEADER_SIZE + pSession->contentType.length;
561 size_t dataSignaturePos = encryptedSessionKeyPos + pSession->encryptedSessionKeyLength;
563 pSession->dataOffset = headerSignaturePos + SHA1_HASH_SIZE;
564 memcpy(pSession->topHeader, topHeaderTemplate, sizeof topHeaderTemplate);
565 pSession->topHeader[CONTENT_TYPE_LENGTH_POS] =
566 (unsigned char)pSession->contentType.length;
567 memcpy(pOutput->fromConvertData.pBuffer, pSession->topHeader, TOP_HEADER_SIZE);
569 pSession->contentType.ptr, pSession->contentType.length);
571 pSession->pEncryptedSessionKey, pSession->encryptedSessionKeyLength);
579 pOutput->fromConvertData.numBytes = pSession->dataOffset;
589 * @param[in,out] pSession A reference to a converter session.
595 static FwdLockConv_Status_t FwdLockConv_MatchMimeHeaders(FwdLockConv_Session_t *pSession,
599 switch (pSession->scannerState) {
602 pSession->mimeHeaderName.length = 0;
603 status = FwdLockConv_StringAppend(&pSession->mimeHeaderName, tolower(ch));
605 pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderName;
608 pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeadersEnd;
615 status = FwdLockConv_StringAppend(&pSession->mimeHeaderName, tolower(ch));
617 status = FwdLockConv_RecognizeMimeHeaderName(pSession);
619 pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderNameEnd;
626 status = FwdLockConv_RecognizeMimeHeaderName(pSession);
633 status = FwdLockConv_StringAppend(&pSession->contentType, tolower(ch));
635 pSession->scannerState = FwdLockConv_ScannerState_WantsContentType;
643 status = FwdLockConv_StringAppend(&pSession->contentType, tolower(ch));
645 pSession->scannerState = FwdLockConv_ScannerState_WantsCR;
647 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
649 pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderValueEnd;
656 pSession->scannerState = FwdLockConv_ScannerState_Wants_A_OR_I;
658 pSession->scannerState = FwdLockConv_ScannerState_Wants_B;
665 pSession->scannerState = FwdLockConv_ScannerState_Wants_N;
667 pSession->scannerState = FwdLockConv_ScannerState_Wants_S;
674 pSession->scannerState = FwdLockConv_ScannerState_Wants_A;
681 pSession->scannerState = FwdLockConv_ScannerState_Wants_R;
688 pSession->scannerState = FwdLockConv_ScannerState_Wants_Y;
695 pSession->contentTransferEncoding = FwdLockConv_ContentTransferEncoding_Binary;
696 pSession->scannerState = FwdLockConv_ScannerState_WantsContentTransferEncodingEnd;
703 pSession->scannerState = FwdLockConv_ScannerState_Wants_E;
710 pSession->scannerState = FwdLockConv_ScannerState_Wants_6;
717 pSession->scannerState = FwdLockConv_ScannerState_Wants_4;
724 pSession->contentTransferEncoding = FwdLockConv_ContentTransferEncoding_Base64;
725 pSession->scannerState = FwdLockConv_ScannerState_WantsContentTransferEncodingEnd;
732 pSession->scannerState = FwdLockConv_ScannerState_Wants_I;
739 pSession->scannerState = FwdLockConv_ScannerState_Wants_T;
746 pSession->contentTransferEncoding = FwdLockConv_ContentTransferEncoding_Binary;
747 pSession->scannerState = FwdLockConv_ScannerState_WantsContentTransferEncodingEnd;
754 pSession->scannerState = FwdLockConv_ScannerState_WantsCR;
756 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
758 pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderValueEnd;
765 pSession->scannerState = FwdLockConv_ScannerState_WantsCR;
767 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
774 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
779 pSession->scannerState = FwdLockConv_ScannerState_WantsMimeHeaderNameStart;
786 status = FwdLockConv_ApplyDefaults(pSession);
788 status = FwdLockConv_VerifyContentType(pSession);
791 status = FwdLockConv_WriteHeader(pSession, pOutput);
794 if (pSession->contentTransferEncoding ==
796 pSession->parserState = FwdLockConv_ParserState_WantsBinaryEncodedData;
798 pSession->parserState = FwdLockConv_ParserState_WantsBase64EncodedData;
800 pSession->scannerState = FwdLockConv_ScannerState_WantsByte1;
816 * @param[in,out] pSession A reference to a converter session.
818 static void FwdLockConv_IncrementCounter(FwdLockConv_Session_t *pSession) {
820 while ((++pSession->counter[i] == 0) && (++i < AES_BLOCK_SIZE))
827 * @param[in,out] pSession A reference to a converter session.
833 static FwdLockConv_Status_t FwdLockConv_WriteEncryptedChar(FwdLockConv_Session_t *pSession,
836 if (pOutput->fromConvertData.numBytes == pSession->outputBufferSize) {
838 pSession->outputBufferSize += OUTPUT_BUFFER_SIZE_INCREMENT;
839 pBuffer = realloc(pOutput->fromConvertData.pBuffer, pSession
845 if (++pSession->keyStreamIndex == AES_BLOCK_SIZE) {
846 FwdLockConv_IncrementCounter(pSession);
847 pSession->keyStreamIndex = 0;
849 if (pSession->keyStreamIndex == 0) {
850 AES_encrypt(pSession->counter, pSession->keyStream, &pSession->encryptionRoundKeys);
852 ch ^= pSession->keyStream[pSession->keyStreamIndex];
854 ++pSession->numDataBytes;
861 * @param[in,out] pSession A reference to a converter session.
867 static FwdLockConv_Status_t FwdLockConv_MatchBinaryEncodedData(FwdLockConv_Session_t *pSession,
871 switch (pSession->scannerState) {
873 if (ch != pSession->delimiter[pSession->delimiterMatchPos]) {
877 for (i = 0; i < pSession->delimiterMatchPos; ++i) {
878 status = FwdLockConv_WriteEncryptedChar(pSession, pSession->delimiter[i], pOutput);
883 pSession->delimiterMatchPos = 0;
885 if (ch != pSession->delimiter[pSession->delimiterMatchPos]) {
887 status = FwdLockConv_WriteEncryptedChar(pSession, ch, pOutput);
888 } else if (++pSession->delimiterMatchPos == pSession->delimiterLength) {
891 pSession->scannerState = FwdLockConv_ScannerState_WantsFirstDash;
896 pSession->scannerState = FwdLockConv_ScannerState_WantsSecondDash;
903 pSession->parserState = FwdLockConv_ParserState_Done;
929 * @param[in,out] pSession A reference to a converter session.
935 static FwdLockConv_Status_t FwdLockConv_MatchBase64EncodedData(FwdLockConv_Session_t *pSession,
939 switch (pSession->scannerState) {
943 pSession->ch = base64Values[ch] << 2;
944 pSession->scannerState = FwdLockConv_ScannerState_WantsByte2;
946 pSession->savedScannerState = FwdLockConv_ScannerState_WantsByte1_AfterCRLF;
947 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
949 if (pSession->scannerState == FwdLockConv_ScannerState_WantsByte1_AfterCRLF) {
950 pSession->delimiterMatchPos = 3;
951 pSession->scannerState = FwdLockConv_ScannerState_WantsDelimiter;
961 pSession->ch |= base64Values[ch] >> 4;
962 status = FwdLockConv_WriteEncryptedChar(pSession, pSession->ch, pOutput);
964 pSession->ch = base64Values[ch] << 4;
965 pSession->scannerState = FwdLockConv_ScannerState_WantsByte3;
968 pSession->savedScannerState = pSession->scannerState;
969 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
976 pSession->ch |= base64Values[ch] >> 2;
977 status = FwdLockConv_WriteEncryptedChar(pSession, pSession->ch, pOutput);
979 pSession->ch = base64Values[ch] << 6;
980 pSession->scannerState = FwdLockConv_ScannerState_WantsByte4;
983 pSession->savedScannerState = pSession->scannerState;
984 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
986 pSession->scannerState = FwdLockConv_ScannerState_WantsPadding;
993 pSession->ch |= base64Values[ch];
994 status = FwdLockConv_WriteEncryptedChar(pSession, pSession->ch, pOutput);
996 pSession->scannerState = FwdLockConv_ScannerState_WantsByte1;
999 pSession->savedScannerState = pSession->scannerState;
1000 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
1002 pSession->scannerState = FwdLockConv_ScannerState_WantsWhitespace;
1009 pSession->scannerState = pSession->savedScannerState;
1016 pSession->scannerState = FwdLockConv_ScannerState_WantsWhitespace;
1024 pSession->savedScannerState = FwdLockConv_ScannerState_WantsWhitespace_AfterCRLF;
1025 pSession->scannerState = FwdLockConv_ScannerState_WantsLF;
1027 if (pSession->scannerState == FwdLockConv_ScannerState_WantsWhitespace_AfterCRLF) {
1028 pSession->delimiterMatchPos = 3;
1029 pSession->scannerState = FwdLockConv_ScannerState_WantsDelimiter;
1034 pSession->scannerState = FwdLockConv_ScannerState_WantsWhitespace;
1040 if (ch != pSession->delimiter[pSession->delimiterMatchPos]) {
1042 } else if (++pSession->delimiterMatchPos == pSession->delimiterLength) {
1043 pSession->scannerState = FwdLockConv_ScannerState_WantsFirstDash;
1048 pSession->scannerState = FwdLockConv_ScannerState_WantsSecondDash;
1055 pSession->parserState = FwdLockConv_ParserState_Done;
1070 * @param[in,out] pSession A reference to a converter session.
1076 static FwdLockConv_Status_t FwdLockConv_PushChar(FwdLockConv_Session_t *pSession,
1080 ++pSession->numCharsConsumed;
1081 switch (pSession->parserState) {
1083 status = FwdLockConv_MatchOpenDelimiter(pSession, ch);
1086 status = FwdLockConv_MatchMimeHeaders(pSession, ch, pOutput);
1089 status = FwdLockConv_MatchBinaryEncodedData(pSession, ch, pOutput);
1092 if (ch == '\n' && pSession->scannerState != FwdLockConv_ScannerState_WantsLF) {
1094 status = FwdLockConv_MatchBase64EncodedData(pSession, '\r', pOutput);
1099 status = FwdLockConv_MatchBase64EncodedData(pSession, ch, pOutput);
1120 FwdLockConv_Session_t *pSession = sessionPtrs[*pSessionId];
1121 pSession->encryptedSessionKeyLength = FwdLockGlue_GetEncryptedKeyLength(KEY_SIZE);
1122 if (pSession->encryptedSessionKeyLength < AES_BLOCK_SIZE) {
1127 pSession->pEncryptedSessionKey = malloc(pSession->encryptedSessionKeyLength);
1128 if (pSession->pEncryptedSessionKey == NULL) {
1131 if (!FwdLockGlue_GetRandomNumber(pSession->sessionKey, KEY_SIZE)) {
1133 } else if (!FwdLockGlue_EncryptKey(pSession->sessionKey, KEY_SIZE,
1134 pSession->pEncryptedSessionKey,
1135 pSession->encryptedSessionKeyLength)) {
1138 status = FwdLockConv_DeriveKeys(pSession);
1141 memset(pSession->sessionKey, 0, KEY_SIZE); // Zero out key data.
1142 memcpy(pSession->counter, pSession->pEncryptedSessionKey, AES_BLOCK_SIZE);
1143 pSession->parserState = FwdLockConv_ParserState_WantsOpenDelimiter;
1144 pSession->scannerState = FwdLockConv_ScannerState_WantsFirstDash;
1145 pSession->numCharsConsumed = 0;
1146 pSession->delimiterMatchPos = 0;
1147 pSession->mimeHeaderName = nullString;
1148 pSession->contentType = nullString;
1149 pSession->contentTransferEncoding =
1151 pSession->keyStreamIndex = -1;
1155 free(pSession->pEncryptedSessionKey);
1177 FwdLockConv_Session_t *pSession = sessionPtrs[sessionId];
1178 pSession->dataOffset = 0;
1179 pSession->numDataBytes = 0;
1184 status = FwdLockConv_PushChar(pSession, ((char *)pBuffer)[i], pOutput);
1191 HMAC_Update(&pSession->signingContext,
1192 &((unsigned char *)pOutput->fromConvertData.pBuffer)[pSession->dataOffset],
1193 pSession->numDataBytes);
1195 pOutput->fromConvertData.errorPos = pSession->numCharsConsumed;
1206 FwdLockConv_Session_t *pSession = sessionPtrs[sessionId];
1208 if (pSession->parserState != FwdLockConv_ParserState_Done) {
1209 pSession->numCharsConsumed;
1214 HMAC_Final(&pSession->signingContext, pOutput->fromCloseSession.signatures,
1221 HMAC_Init_ex(&pSession->signingContext, NULL, KEY_SIZE, NULL, NULL);
1222 HMAC_Update(&pSession->signingContext, pSession->topHeader, TOP_HEADER_SIZE);
1223 HMAC_Update(&pSession->signingContext, (unsigned char *)pSession->contentType.ptr,
1224 pSession->contentType.length);
1225 HMAC_Update(&pSession->signingContext, pSession->pEncryptedSessionKey,
1226 pSession->encryptedSessionKeyLength);
1227 HMAC_Update(&pSession->signingContext, pOutput->fromCloseSession.signatures,
1229 HMAC_Final(&pSession->signingContext,
1235 pSession->contentType.length + pSession->encryptedSessionKeyLength;
1241 free(pSession->mimeHeaderName.ptr);
1242 free(pSession->contentType.ptr);
1243 free(pSession->pEncryptedSessionKey);
1244 HMAC_CTX_cleanup(&pSession->signingContext);