#!/usr/bin/perl # Based on code by Corris Randall package UservoiceToken; use Crypt::CBC; use Digest::SHA; use URI::Escape; use MIME::Base64; use JSON; # call as: # my $user_data = { guid => '1295301525', display_name => 'Example User', expires => '2011-01-17 22:28:45' }; # my $token = new UservoiceToken; # $token->create($user_data) sub new { my $class = shift; my $self = {}; $self->{'uservoice_subdomain'} = 'FILL IN'; $self->{'sso_key'} = 'FILL IN'; $self->{'iv'} = "OpenSSL for Ruby"; $self->{'meth'} = "Crypt::Rijndael"; bless $self, $class; return $self; } sub create { my $self = shift; my $hash = shift; my $json = new JSON; my $data = $json->encode($hash); my $sha = new Digest::SHA; $sha->add( $self->{'sso_key'} . $self->{'uservoice_subdomain'} ); my $key = substr($sha->hexdigest,0,32); # xor the iv into the first 16 bytes. foreach my $i ( 0 .. 15 ) { substr($data,$i,1) ^= substr($self->{'iv'},$i,1); } # create cipher object $obj = Crypt::CBC->new ( -key => pack("H*",$key), -literal_key => 1, -header => "none", -keysize => 16, -iv => $self->{'iv'}, -cipher => $self->{'meth'} ); # encrypt data $encdata = $obj->encrypt( $data ); return uri_escape(encode_base64( $encdata )); }