diff options
author | Luo Jinghua <sunmoon1997@gmail.com> | 2009-09-20 20:41:56 +0800 |
---|---|---|
committer | Luo Jinghua <sunmoon1997@gmail.com> | 2009-09-20 20:41:56 +0800 |
commit | 92be48f42eb013cf041f28486835ab7bb8a3e1eb (patch) | |
tree | 66c85a9fd520f750e5902f6c021e9b9ca9d80bff | |
parent | c67b8d9b094bd29fdc5b834f70261946eb76e0ec (diff) |
ppssrc: transform url from tvod::// to pps:// if possible
-rw-r--r-- | src/gstppssrc.c | 83 |
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: |