summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2009-09-20 20:41:56 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2009-09-20 20:41:56 +0800
commit92be48f42eb013cf041f28486835ab7bb8a3e1eb (patch)
tree66c85a9fd520f750e5902f6c021e9b9ca9d80bff
parentc67b8d9b094bd29fdc5b834f70261946eb76e0ec (diff)
ppssrc: transform url from tvod::// to pps:// if possible
-rw-r--r--src/gstppssrc.c83
1 files changed, 81 insertions, 2 deletions
diff --git a/src/gstppssrc.c b/src/gstppssrc.c
index af95dd5..d099915 100644
--- a/src/gstppssrc.c
+++ b/src/gstppssrc.c
@@ -981,6 +981,19 @@ gst_pps_src_hexlify (gchar *dst, const gchar *src, size_t len)
return 2 * len;
}
+#define UNHEXLIFY(ch) (ch >= '0' && ch <= '9' ? ch - '0' : ch - 'a' + 10)
+static int
+gst_pps_src_unhexlify (gchar *dst, const gchar *src, size_t len)
+{
+ int i;
+
+ for (i = 0;i < len;i ++)
+ dst[i] = UNHEXLIFY (src[2 * i]) << 4 | UNHEXLIFY (src[2 * i + 1]);
+
+ dst[len] = 0;
+ return len;
+}
+
static char* gst_pps_src_encrypt_uri (const char *url, int id)
{
const static unsigned char key[16] = "884d977e1a515ae4";
@@ -1032,6 +1045,64 @@ static char* gst_pps_src_encrypt_uri (const char *url, int id)
return dest;
}
+static char* gst_pps_src_decrypt_uri (const char *url, int id)
+{
+ const static unsigned char key[16] = "884d977e1a515ae4";
+ int len;
+ char *ptr;
+ char *dest;
+ char *plain;
+ char *cipher;
+ char *padding;
+ int i;
+ size_t size, left;
+ AES_KEY aes_key;
+
+ AES_set_decrypt_key (key, 128, &aes_key);
+
+ url += 7;
+ ptr = strchr (url, '/');
+ if (!ptr)
+ return NULL;
+
+ len = ptr - url;
+ if (len & 1)
+ return NULL;
+
+ /* align (len + '\0', 16) */
+ size = (len + 1 + 15) & ~15;
+ plain = g_malloc (size);
+ cipher = g_malloc (size);
+
+ len = gst_pps_src_unhexlify (cipher, url, len / 2);
+
+ /* padding */
+ left = (size - len) % 16;
+ for (i = 0; i < left; i++)
+ cipher[len + i] = '\0';
+
+ len += left;
+
+ for (i = 0; i < len / 16; i++)
+ AES_decrypt ((const unsigned char*)cipher + 16 * i,
+ (unsigned char*)plain + 16 * i, &aes_key);
+
+ dest = g_new0 (gchar, 6 + len * 2 + strlen (ptr) + 1);
+ strcpy (dest, "pps://");
+
+ strncpy (dest + 6, plain, len);
+ padding = strstr (dest + 6, ".pps");
+ if (!padding)
+ padding = dest + strlen (dest);
+ else
+ padding = padding + 4;
+ strcpy (padding, ptr);
+
+ g_free (plain);
+ g_free (cipher);
+ return dest;
+}
+
static gchar*
gst_pps_src_recode_uri (const gchar *pps)
{
@@ -1060,8 +1131,13 @@ gst_pps_src_transform_uri (const gchar *pps, int id)
{
gchar *uri, *gb_uri, *recoded_uri;
gchar *result = NULL;
+ gboolean encrypt;
- if (!g_str_has_prefix (pps, "pps://"))
+ if (g_str_has_prefix (pps, "pps://"))
+ encrypt = TRUE;
+ else if (g_str_has_prefix (pps, "tvod://"))
+ encrypt = FALSE;
+ else
return NULL;
uri = g_uri_unescape_string (pps, NULL);
@@ -1077,7 +1153,10 @@ gst_pps_src_transform_uri (const gchar *pps, int id)
if (!recoded_uri)
goto free_gb_uri;
- result = gst_pps_src_encrypt_uri (recoded_uri, id);
+ if (encrypt)
+ result = gst_pps_src_encrypt_uri (recoded_uri, id);
+ else
+ result = gst_pps_src_decrypt_uri (recoded_uri, id);
g_free (recoded_uri);
free_gb_uri: