File Coverage

blib/lib/Webqq/Encryption/RSA.pm
Criterion Covered Total %
statement 16 21 76.1
branch 3 6 50.0
condition n/a
subroutine 3 3 100.0
pod n/a
total 22 30 73.3


line stmt bran cond sub pod time code
1             package Webqq::Encryption::RSA;
2 1     1   5 use strict;
  1         1  
  1         21  
3 1     1   8 use Carp;
  1         2  
  1         255  
4              
5             BEGIN{
6 1     1   2 eval{
7 1         287 require Crypt::RSA::ES::PKCS1v15;
8 0         0 require Crypt::RSA::Key::Public;
9             };
10 1 50       5 unless($@){
11 0         0 $Webqq::Encryption::RSA::has_crypt_rsa = 1;
12             }
13             else{
14 1         2 eval{
15 1         244 require Crypt::OpenSSL::RSA;
16 0         0 require Crypt::OpenSSL::Bignum;
17             };
18 1 50       4 unless($@){
19 0         0 $Webqq::Encryption::RSA::has_crypt_openssl_rsa = 1;
20             }
21             else{
22 1         1 eval{require JE;};
  1         244  
23 1 50       4 unless($@){
24 0         0 $Webqq::Encryption::RSA::has_je = 1;
25             }
26             else{
27 1         231 croak "You must install Crypt::RSA or Crypt::OpenSSL::RSA or JE module to support rsa encrypt\n";
28             }
29             }
30             }
31            
32             }
33              
34             sub encrypt {
35             my $data = shift;
36             if($Webqq::Encryption::RSA::has_crypt_rsa){
37             my $n = "0xF20CE00BAE5361F8FA3AE9CEFA495362FF7DA1BA628F64A347F0A8C012BF0B254A30CD92ABFFE7A6EE0DC424CB6166F8819EFA5BCCB20EDFB4AD02E412CCF579B1CA711D55B8B0B3AEB60153D5E0693A2A86F3167D7847A0CB8B00004716A9095D9BADC977CBB804DBDCBA6029A9710869A453F27DFDDF83C016D928B3CBF4C7";
38             my $public = Crypt::RSA::Key::Public->new();
39             $public->e("0x3");
40             $public->n($n);
41             my $rsa = Crypt::RSA::ES::PKCS1v15->new();
42             return lc join "",unpack "H*", $rsa->encrypt(Message=>$data,Key=>$public,);
43             }
44             elsif($Webqq::Encryption::RSA::has_crypt_openssl_rsa){
45             my $n = Crypt::OpenSSL::Bignum->new_from_hex("F20CE00BAE5361F8FA3AE9CEFA495362FF7DA1BA628F64A347F0A8C012BF0B254A30CD92ABFFE7A6EE0DC424CB6166F8819EFA5BCCB20EDFB4AD02E412CCF579B1CA711D55B8B0B3AEB60153D5E0693A2A86F3167D7847A0CB8B00004716A9095D9BADC977CBB804DBDCBA6029A9710869A453F27DFDDF83C016D928B3CBF4C7");
46             my $e = Crypt::OpenSSL::Bignum->new_from_hex("3");
47             my $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters($n,$e);
48             $rsa->use_pkcs1_padding();
49             return lc join "",unpack "H*", $rsa->encrypt($data);
50             }
51              
52             $data = join "",map {"\\x$_"} unpack "H2"x length($data),$data;
53             my $je;
54             if(defined $Webqq::Encryption::RSA::_je ){
55             $je = $Webqq::Encryption::RSA::_je ;
56             }
57             else{
58             my $javascript;
59             if(defined $Webqq::Encryption::RSA::_javascript){
60             $javascript = $Webqq::Encryption::RSA::_javascript;
61             }
62             else{
63             local $/ = undef;
64             $javascript = ;
65             $Webqq::Encryption::RSA::_javascript = $javascript;
66             close DATA;
67             }
68             $je = JE->new;
69             $je->eval($javascript);
70             croak "Webqq::Encryption::RSA load javascript error: $@\n" if $@;
71             $Webqq::Encryption::RSA::_je = $je;
72             }
73            
74             #print qq#
75             # var rsa = RSA();
76             # var r = rsa.rsa_encrypt('$data');
77             # return(r);
78             ##;
79             my $p = $je->eval(qq#
80             var rsa = RSA();
81             var r = rsa.rsa_encrypt('$data');
82             return(r);
83             #);
84             if($p and !$@){
85             return $p;
86             }
87             else{
88             croak "Webqq::Encryption::RSA error: $@\n";
89             }
90            
91             }
92              
93             1;
94             __DATA__