CCBigNum CCBigNum::operator%(const CCBigNum& modulus) const
{
    CCStatus status = kCCSuccess;
    CCBigNumRef result = CCCreateBigNum(&status);
    RELEASE_ASSERT(!status);

    status = CCBigNumMod(result, m_number, modulus.m_number);
    RELEASE_ASSERT(!status);

    return result;
}
static int testMod()
{
    CCStatus status;
    
    // Shift n right by 11
    CCBigNumRef a = CCBigNumFromHexString(&status, "c968e40c5304364b057425920b18cc358f254ddb0f42f84850d6deec46006b4a692e52b7c3bddead45f77f2c1be1c606521d8a24260429f362d65b57873dbf270e97e210b872e45e97cb4cd87977ad20491e53c48cf0e88da9a61312675a2527c86ac537740c5e4206972f09c0f91fa1c9f14a2cf1be07e82a3b6fd58dc12c3a");
    CCBigNumRef c = CCBigNumFromHexString(&status, "354c912b09ee7abff5b3d94ed52a9e8dcae582e094daa375c495f970710af73efcc4f9776010511f654c7408a6d5d351ab1d94a0fede757d782b54ddcf6fe8d714870b78b0e67a9754cb03a5cf63bbda1c71791902ea4527fb0cd76437391e5422c704ffb6d6018261171d8cee98adcf0243f1fd520fb3761afe94a2f4d99f94");
    CCBigNumRef resultExpected = CCBigNumFromHexString(&status, "2983308b3538c60b245899a58b98f08c2e74c53950b30de70314f29af2df858d72df6651a38ceb4f1612231227604c1150c4cc412968c97afa545cbe18ee04a1d102bfa6a5bf7498996a41e70b4c7991f3c9e87984321915b87f8ce5c1aeca2b6015b6384f8a59bae351d662f52f1634c3257434fb8eed85d93fb1ecaf344d7e");
    CCBigNumRef output = CCCreateBigNum(&status);
    
    status = CCBigNumMod(output, a, c);
    ok(status == 0, "operation completed");
    ok(CCBigNumCompare(output, resultExpected) == 0, "expected operation result");
    
    CCBigNumFree(a);
    CCBigNumFree(c);
    CCBigNumFree(output);
    CCBigNumFree(resultExpected);
    return 0;
}